首页 > 其他分享 >标准C语言2

标准C语言2

时间:2024-05-05 15:33:48浏览次数:23  
标签:语句 类型转换 int 代码 C语言 运算符 标准 循环

二、常量(了解)

​ 常量就是程序运行过程中不能改变的量,C语言中常量有:字面值常量、宏常量、枚举常量。

字面值常量

100		int
100l	long
100ll	long long
100u	unsigned int
100lu	unsigned long
100llu	unsigned long long
定义一个宏常量表示100年总共有多少秒,不考虑闰平年
	#defined SEC 3600*24*365*100u

3.14	double
3.14f	float
3.14F   long double

'b' 	char

注意:使用适当的后缀可以确保数据类型的匹配,其次提高代码可读性,如果没有正确的后缀,可能导致不正确的结果或者类型转换的问题

三、格式化输出

%nd		最少显示n个字符宽度,不够则补空格,右对齐
%-nd	最少显示n个字符宽度,不够则补空格,左对齐
%0nd	最少显示n个字符宽度,不够则补0,右对齐
%n.mf	最少显示n个字符宽度(包括小数点),小数点后显示m个字符宽度,不够则补空格,右对齐
%g		不显示小数点后多余的0

四、运算符

自变运算符
前自变:++num/--num
	变量的值立即加1或者减1
后自变:num++/num--
    变量的值也会加1或减1,但是在下一行代码才生效
注意:

​ 不要在一行代码中过多地使用自变运算符,因为不同的编译器对它们的解释规则不同,而且有时候会在合适的地方把后自变优化成前自变

​ 只能给变量使用自变运算符

算术运算符
+ - * 
    /	除		进行除法运算,获取商
    %	求余		进行除法运算,获取余数
注意:
	整数/整数	计算结果没有小数部分	例如5/3 1  3/5 0
    /和%都是除法运算,除数不能为0,运行时会出现 浮点数例外 (核心已转储) 的报错信息,并且程序立即停止运行
    求余的运算对象不能出现浮点数 
关系运算符
>
>=
<
<=
==	相等
!=	不相等

注意1:它们的运算结果是逻辑值,C语言中的逻辑值用0(假)和1(真)来模拟的,并且计算出来的结果还可以继续参与数学运算

注意2:

​ 与数学规则不同 ,10 < num <100 在C语言中会先计算左边小于号,得到逻辑值1\0,该结果继续与100进行比较,一定满足小于100,所以在C中是恒为真的。

注意3:

​ 使用 == 运算符时,容易漏写一个= ,变成赋值,所以一般把常量放在==的左边,如果漏写,编译器会报错

逻辑运算符
会把运算对象先转换成逻辑值再运算,值为0时逻辑为假,值非0时逻辑为真
A && B	逻辑与运算符 
	一假即假
A || B	逻辑或运算符 
	一真即真
!A	逻辑非运算符	
	求反
注意:! 运算符的优先级要比 && || 高
&& || 短路特性:

​ 当左边的运算结果已经可以确定整个逻辑运算表达式的结果时,右边的不再进行运行

​ 适当地使用该特性可以精简if单分支结构,能看懂即可,不要太过分,不要过分地影响代码可读性

if(num > 0) {   
    num++;
} 
等同于
((num > 0) && (num++)); 
三目运算符
[A] ? [B] : [C]
有三个运算对象,先把A转换成逻辑值,为真则执行B,为假则执行C,相当于精简版的if else结构

注意:与else if不同的是三目运算符必须有运算结果,所以里面不能出现流程控制语句:return 0\break\continue

赋值运算符
=		注意:赋值的值就是整个赋值运算符的运算结果
a += b;		a = a+b;
a -= b;	a *= b; a/=b; a%=b;
sizeof字节运算符:

​ sizeof不是函数,是C语言32个关键字之一,能计算出数据在内存中的所需要的字节数,如果运算对象不是一个表达式时,可以不使用小括号 sizeof num

​ 并且sizeof括号内的表达式没有执行,只是猜测里面字节数最大为结果`

sizeof(10>100?3.13:40)	//	结果是8 并没有执行三目运算符
位运算符

​ & | ~ ^ >> << 都是针对数据的二进制补码进行运算,后序再详细讲解

五、类型转换

前提:只有相同类型的数据才能在一起进行运算,因为不同类型的数据,字节数不同、格式、运算规则不同,必须把不同类型的数据转换成同一类型才能运算。

自动类型转换(隐式类型转换):

​ 不同类型的数据组成的表达式,编译器会把先它们转换成相同的类型再计算,这叫作自动类型类型或隐式类型转换,它们的转换规则是以不丢失数据为前提:在C语言中,当不同的基本类型组成表达式时,会发生自动类型转换。这些转换规则通常是为了使表达式能够正确计算。以下是一些基本类型在表达式中自动类型转换的规则:

  1. 整数提升:在表达式中,所有的char和short类型的值都会被提升为int类型。

  2. 算术转换:算术转换发生在不同数值类型之间。具体来说,当一个操作数是浮点数(float或double)而另一个操作数是整数(int、char、short等)时,整数会被转换为浮点数。这种转换确保了浮点数和整数之间进行运算时的精度。

  3. 无符号整数和有符号整数的转换:当无符号整数和有符号整数进行运算时,有符号整数的类型会被提升为与其范围相同的无符号整数类型。

  4. 赋值运算符(=):在赋值运算符中,右边的表达式会被转换为左边变量的类型。

    ​ 这些规则是为了使C语言在处理不同类型的数据时能够正确地计算结果。然而,需要注意的是,过多的类型转换可能会导致代码难以理解和维护,因此在编写代码时需要小心处理这些转换。

强制类型转换(显式类型转换):

​ 在C语言中,强制类型转换(也称为显式类型转换)用于将一个表达式或变量的值强制转换为指定的类型。强制类型转换的语法如下:

(type) expression

其中,type 是目标类型,expression 是要转换的表达式或变量名。

请注意以下几点关于强制类型转换的注意事项:

  1. 强制类型转换可以将表达式或变量的值转换为目标类型,无论其原始类型是什么。这可能导致精度损失或数据截断(字节多的向字节数少进行转换 )。
  2. 强制类型转换只改变值的解释方式,而不改变任何位的内容。例如,将一个浮点数转换为整数时,小数部分会被丢弃。
  3. 当进行强制类型转换时,应确保转换操作是合法和安全的。例如,在将浮点数转换为整数时,如果浮点数超出了整数类型的表示范围,则结果可能是不确定的。
  4. 强制类型转换可以应用于基本类型、指针类型和枚举类型。

以下是一些示例,展示了强制类型转换的使用情况:

int a = 10;
double b = 3.14;
int result = (int) b;  // 将浮点数转换为整数类型
double sum = (double) a + b;  // 将整数转换为浮点数类型

int* ptr = (int*) malloc(sizeof(int));  // 强制将返回类型为 void* 的 malloc 转换为 int* 类型

enum Colors { RED, GREEN, BLUE };
int color = (int) GREEN;  // 将枚举类型转换为整数类型

​ 需要谨慎使用强制类型转换,确保转换操作的安全性和合理性。不正确的类型转换可能会导致程序运行时错误和不确定的行为。应仔细考虑使用强制类型转换的场景,并尽量避免过度依赖强制类型转换来解决问题,而是考虑是否有更好的设计和类型匹配的方案。

六、if语句

​ 代码的默认执行流程是从上到下,逐步、逐条执行的,if语句可以根据判断条件选择让代码是否执行,改变了代码 的默认执行流程,所以这种语句也叫流程控制语句。

if(条件) { // 单分支  
	// 当条件为真时,执行此处代码,如果此处代码只有一行,大括号可以省略,但在商业项目中建议不要省略,因为这样会影响代码的可扩展性
}

if(条件) {	// 双分支
	// 当条件为真时,执行此处代码
} else {
	// 当条件为假时,执行此处代码
}

if(条件1) { // 多分支
	// 当条件1为真时,执行此处代码
} else if(条件2) { // 可以有多个else if
    // 当条件2为真时,执行此处代码
} 
...
else {
	// 当条件1、条件2都为假时,执行此处代码
}

注意:

​ 如果if、else的代码块只有一行代码,大括号可以省略。

​ 尽管C语言允许在if语句中省略大括号,但这样做可能导致以下问题:

  1. 可读性差:如果省略大括号,只有紧随其后的一行代码会在if条件为真时执行。这样容易导致代码混淆,特别是当if语句中有多行代码时,很难一目了然地知道哪些代码受到if条件的控制。
  2. 容易出错:因为只有紧随其后的一行代码受到if条件的控制,如果在if语句后面添加其他代码而没有添加大括号,则新添加的代码无论if条件真还是假都会执行。这可能会导致逻辑错误和意外行为。
  3. 可维护性低:如果要在if条件为真时添加更多代码,需要手动添加大括号。在多个if语句嵌套时,容易忘记添加大括号或添加错误的大括号,导致逻辑混乱和错误。

因此,为了保证程序的可读性、可靠性和可维护性,推荐始终使用大括号明确指定if语句的代码块。即使if条件只控制一行代码,也应该用大括号将该行代码包裹起来,以防止潜在的错误和增加代码的可读性。

七、switch开关语句

switch(数据) {
    case v1:	语句1;	break;
    case v2:	语句2;	break;
    case v3:	语句3;	break;
	...
    default:	语句4;
}

1、switch小括号中的数据可以是变量、表达式、常量,但是结果一定是整型;case后面的数据也必须是整型常量,不能是变量

2、当case后面的值与数据相等时会打开开关,case后面的语句会执行,如果开关没有通过break关闭,那会一直往下执行

3、default无论放在switch中哪个位置,当所有的case开关都不满足时,会最后执行dafault的内容

4、switch与if else 比较只是代码较为简洁,switch能解决的问题,if else一样可以解决,所以在实际开发中程序员一般只使用if else就足够了

gnu编译器的专用语法:
switch(数据) {
    case n1 ... n2:	语句; break;
}
表示 [n1,n2]之间都满足打开开关

八、for循环语句

​ 通过反复执行一段代码,达到解决问题的目的,被反复执行的代码称为循环语句

​ for是一种非常灵活的循环,一般使用一个变量来引导它的执行,该变量称为循环变量,早期使用index名字作为循环变量名,后面逐渐演变成i,如果有多个循环嵌套时,可以使用i j k l

for ([1]; [2]; [3]) {
   [4]; 
}

模块1:为for循环做一些准备工作:定义循环变量、给循环变量赋初值,但是在for中定义的变量,一旦出了循环就无法使用
模块2:判断循环条件是否成立,如果条件成立执行模块4,如果条件不成立则结束for循环,如果没有语句,则默认条件成立
模块4:被反复执行的代码,称为循环体语句
模块3:改变循环变量的值,让循环变量自加或自减,i++、i--,防止出现死循环
循环流程:
	1、2、4、3、2、4、3、2、4、3、4...
    
C89语法标准下不允许在模块1中定义变量,C99之后允许定义,当前Ubuntu16.04默认的gcc语法标准采用的是c99标准
如果想要使用其他标准:
	gcc xxx.c -std=gnu89\99\11
for的不同写法:
for (;;) {	//	死循环
    ...
}

int i=0;
for (; i < 10; ++i) {
    ...
}

for(int i = 0; i < 10; ) {
    ...
    i++;
}

for (int i = 0; i < 10; ++i,...);

注意:如果无论for循环写成什么样子,循环体只执行1次,就很有可能是小括号后面加了分号
注意:
	1、建议for的大括号要上下对齐,里面的内容要缩进一次
	2、如果for循环只有一行代码,可以省略大括号,但是商业代码要求不能省略

九、while循环语句

while (循环条件) {
   	//	循环语句
}

for (;循环条件;) {
    //	与上面的while效果一致
}

执行流程:先检查循环条件,条件为真执行循环体,条件为假,直接结束while循环

for循环的精简版本效果与while相似

当明确知道循环次数的问题适合使用for循环解决

当不明确知道循环次数的问题,适合使用while循环解决

十、do-while循环语句

do {
   //	循环语句 
} while (循环条件);	//	分号不能少

执行流程:先执行循环语句,再判断循环条件,条件为真执行循环体,条件为假,直接结束循环,无论条件真或假,循环语句必定最少执行一次

注意:适合先干活、再判断的场景:输入密码判断

注意:在do-while的大括号中定义变量,在小括号中不能使用

十一、循环嵌套

循环语句中包含了循环语句,特点:外层循环执行1次,内层循环执行n次

for (int i = 0; i < 10; ++i) {
    for (int j = 0; j < 10; ++j) {

    }
    printf("\n");
}

十二、跳转语句

break跳转语句

​ 用法1:在switch语句中可以关闭开关

​ 用法2:在循环语句中,可以跳出所在的一层循环,是一种提前结束循环的一种方式,提高循环效率

continue跳转语句

​ 只能在循环语句中,停止本次循环,直接进入下一次循环,根据条件改善循环的执行

return跳转语句

​ return可以提前结束函数,并返回一个结果给调用者

goto跳转语句

标签:语句,类型转换,int,代码,C语言,运算符,标准,循环
From: https://www.cnblogs.com/sleeeeeping/p/18173536

相关文章

  • C语言 子进程段错误后变成僵尸进程
    空指针获取首元素时出现段错误,子进程异常退出,父进程没有处理。#include<stdio.h>#include<unistd.h>intmain(){pid_tpid;pid=fork();if(pid>0){printf("fatherprocessisPID:%d\n",getpid());while(1){......
  • 标准C语言1
    一、C语言介绍​ 丹尼斯.里奇和肯.汤普逊在1971~1973年美国贝尔实验室,在开发UNIX操作系统时,在BCPL语言的基础上(newB语言),发明第一款高级编程语言,取BCPL第二个字母作为名字,所以叫C语言​ BCPL->newB->C->UNIX->Minix->Linux​ 它是为了开发操作系统而研发的一款编程语言,它特......
  • C语言 父子进程不能共享全局变量
    父子进程不能共享全局变量。父子进程中的任何一方修改了全局变量,只是修改了副本,只对自己可见,对另一方不可见。C语言中即使加了static也不行。#include<stdio.h>#include<unistd.h>//初始值是0intflag;intmain(){pid_tpid;//父进程和子进程执行相同代码即......
  • Go-标准库秘籍(全)
    Go标准库秘籍(全)原文:zh.annas-archive.org/md5/F3FFC94069815F41B53B3D7D6E774406译者:飞龙协议:CCBY-NC-SA4.0前言感谢您给予本书机会!本书是一本指南,带您了解Go标准库的可能性,其中包含了许多开箱即用的功能和解决方案。请注意,本书涵盖的解决方案主要是对标准库实现的简......
  • C语言转写成MIPS指令集汇编以及MIPS指令集汇编中函数调用时栈的变化
    一、问候语欢迎你来到我的博客!二、C语言代码分析  这段C语言代码共有3个函数组成。set_array函数传入1个int类型的变量num,并创建了1个int类型临时变量i和1个临时int类型数组array,里面含有10个单位,此函数主要目的是调用compare函数,并将num和i传入该函数中,得到其函数返回值......
  • 05. C语言数组
    数组用于将多个数据集中存储,方便管理,此文将集中存储任何类型数据的语句都称为数组,数组根据存储数据的类型和方式分为同型数组、结构体、共用体、枚举。 【同型数组】同型数组也直接称为数组,用于存储多个类型相同的数据,数组内的数据称为数组元素,数组元素占用连续的虚拟地址,每个......
  • 浙大版C语言程序设计习题11-17
    点击查看代码typedefstructNODE{intdata;structNODE*next;}NODE,*Linkedlist;//初始化头节点voidInit(Linkedlist&L){L=(NODE*)malloc(sizeof(NODE));L->next=NULL;}//尾插法创建链表LinkedlistCreateFromRear(LinkedlistL){NODE*rear=L;for......
  • C语言代码题
    C语言代码--练习题试写一个函数,计算字符串s中最大连续相同的字符个数。例如,若s为"aaabbbb",则返回值为4;若s为"abcde",则返回值为1。#include<stdio.h>/******************************************************************************functionname:max_sam......
  • 【C语言】---- 文件输入输出与文件管理函数
    1文件输入输出函数1.1打开和关闭文件fopen函数fopen是C标准库中用于打开文件的函数之一。它的原型定义在<stdio.h>头文件中,具体格式如下:FILE*fopen(constchar*filename,constchar*mode);这个函数接受两个参数:filename:一个以字符串形式表示的文件名,用于指定要......
  • C语言 Stack功能实现(自存)
    #include<stdio.h>#include<stdlib.h>#include<stdbool.h>typedefintE;typedefstructnode{Edata;structnode*next;}Node;typedefstruct{Node*top;intsize;}Stack;//APIStack*stack_create(void);void......