前言
本人的技术笔记会优先发布在个人站点longyxblg.cn
C语言是结构化的程序设计语言,结构指顺序结构、选择结构、循环结构。
分支语句
if语法格式
if(表达式)语句C语言中,非0为真,0为假。
intnum=0;scanf("%d",&num);if(num%2==1)print("%d 是奇数\n",num);return0;else
判断是与不是的情况
if(表达式)语句1else语句2intnum=0;scanf("%d",&num);if(num%2==1)printf("%d 是奇数\n",num);elseprintf("%d 是偶数\n",num);分支中包含多条语句
C语言中默认 if 和 else 后只跟一条语句,想跟多条需
要使用 {} 。
intage=0;scanf("%d",&age);if(age>=18){printf("你已经成年了\n");printf("可以去上网了\n");}else{printf("你是个儿童\n");printf("不能去上网\n");}if 嵌套
在 if…else 语句中, else 可以与另一个 if 语句连用,构成多重判断。
intnum=0;scanf("%d",&num);if(num>0)printf("%d 是正数\n",num);elseif(num<0)printf("%d 是负数\n",num);elseprintf("%d 是零\n",num);return0;intnum=0;scanf("%d",&num);if(num>0){if(num%2==1)printf("%d 是正奇数\n",num);elseprintf("%d 是正偶数\n",num);}else{printf("%d 是非正数\n",num);}else 的悬空问题
else 总是与最接近的 if 匹配
inta=0;intb=2;if(a==1)if(b==2)printf("hehe\n");elseprintf("haha\n");这里 else 与 是与 if(b == 2) 匹配 所以结果是什么代码运行结果是什么都没有。
如果想要 else 与 if (a == 1) 相匹配,可以使用{}。
inta=0;intb=2;if(a==1){if(b==2)printf("hehe\n");}elseprintf("haha\n");关系操作符
C语言中用于比较的表达式成为关系表达式,使用的运算符就称为关系运算符。
主要有以下六个:
>// 大于运算符<// 小于运算符>=// 大于等于运算符<=// 小于等于运算符==// 等于运算符!=// 不等运算符关系表达式通常返回的是 0 或 1。
需要注意的是关系运算符不宜连用。
intnum=0;if(18<=num<=20){printf("haha\n");}在上述代码中,执行逻辑是先判断 18 <= 0 返回为 0,然后再比较 0 <= 20 ,为
真,所以执行了语句。
正确写法应使用逻辑运算符,在后文中会说明。
条件操作符
也叫三目操作符,需要三个操作数,形式如下:
exp1?exp2 :exp3计算逻辑如图:
inta=0;intb=0;scanf("%d",&a);b=a>5?3:-3;printf("%d\n",b);逻辑操作符
逻辑操作符提供逻辑判断功能。主要如下:
!:逻辑取反(改变单个表达式的真假)&&:逻辑与,两侧表达式都为真,则为真,否则为假||:逻辑或,两侧表达式有一个是真则为真,否则为假! 逻辑取反
intflag=0;if(!flag){printf("do something\n");}&& 逻辑与
inta=0;intb=0;scanf("%d%d",&a,&b);if(a>0&&b>0){printf("a和b都是正数\n");}|| 逻辑或
inta=0;intb=0;scanf("%d%d",&a,&b);if(a>0||b>0){printf("a和b至少有一个是正数\n");}短路
C语言逻辑运算符总是对左侧的表达式求值,再对右侧的表达式求值。
如果左侧表达式满足逻辑运算符的条件,则不再对右侧表达式求值,这种现象称
为短路。
inta=0;intb=1;if(a>1&&++b){printf("hehe\n");}printf("%d\n",b);这里可以看到 b 的值还是1 ,说明发生了短路,++b 没有执行。
像这种仅仅根据左操作数的结果就能知道整个表达式的结果,不再对右操作数进
行计算的运算称为短路求值。
switch 语句
C语言还提供了 switch 来实现分支结构。
switch 语句 是一种特殊形式 if…else 语句。用于判断条件有多个结果的情况。
switch(expression){casevalue1:statementcasevalue2:statementdefault:statement}根据表达式 expression 表达式的值来执行不同的 case 分支。如果没找到对应值
执行 defaultt 分支。
switch 后的 expression 必须是整型表达式。
case 后的值,必须是整型表达常量。
if 语句和 switch 语句的对比
intn=0;scanf("%d",&n);if(n%3==0)printf("整除,余数为0\n");elseif(n%3==1)printf("余数是1\n");else{printf("余数是2\n");}intn=0;scanf("%d",&n);switch(n%3){case0:printf("整除,余数为0\n");break;case1:printf("余数是1\n");break;case2:printf("余数是2\n");break;}case 和后边的数字之间必须有空格。
case 语句的代码后加上 break ,才能跳出这个 switch 语句。 否则会出现穿透现
象。
switch 语句中的穿透现象
intn=0;scanf("%d",&n);switch(n%3){case0:printf("整除,余数为0\n");case1:printf("余数是1\n");case2:printf("余数是2\n");}某一个 case 后没有跟 break ,代码就会继续往下执行。直到遇到其他 case 中的
break 或 switch 语句结束。
switch 语句中的 default
当 switch 后边的 expression 中的结果与任意 case 中的值都不匹配的时候,就会
默认执行 default 后的语句。
switch 语句中 case 和 default
C语言中并没有硬性规定 case 和 default 的顺序,通常写法是将 default 放在最
后。
while 循环
语法格式
while(表达式)语句执行流程如图
首先执行判断表达式,表达式值为0。循环结束,不为0则执行循环语句,语句执
行完再重复上述过程。
while 循环示例
//输入一个整数,逆序打印他intnum=0;scanf("%d",&num);while(num){printf("%d",num%10);num/=10;}for 循环
语法格式
for(表达式1;表达式2;表达式3)语句表达式1 用于循环变量的初始化
表达式2 用于循环结束的条件判断
表达式3 用于循环变量的调整。
执行流程如图
for 循环示例
// for循环打印1-10inti=0;for(i=1;i<=10;i++){printf("%d\n",i);}do-while 循环
语法格式
do语句while(表达式);do-while 是先进入循环体执行一次语句,再进行判断是否进行循环。
执行流程如下:
do-while 中循环体至少执行一次。
示例如下:
// do-while循环打印1-10intnum=1;do{printf("%d\n",num);num++;}while(num<=10);return0;break 和 continue 语句
C语言中提供了 break 和 continue 两个关键字。
在循环中,break 的作用是永久终止该循环。
continue 是跳过本次循环位于 continue 之后的代码。
break 示例
inti=1;while(i<=10){if(i==5)break;printf("%d ",i);i=i+1;}在 i 的值为 5 时,break 执行,永久终止了这个循环。
continue 举例
inti=1;while(i<=10){if(i==5)continue;printf("%d ",i);i=i+1;}当 i 等于 5 后,就执行 continue,直接跳过 continue后的代码,去循环的判断的
地方。因为里跳过了i = i+1,所以i一直为5,程序陷入和死循环。
goto 语句
C语言提供了 goto 语句 和 跳转标号,可以实现在同一个函数内跳转到设置好的标号处。
// goto语句的使用inti=1;while(i<=10){if(i==5)gotolabel;printf("%d ",i);i=i+1;}label:return0;语句如果使用的不当,就会导致在函数内部随意乱跳转,打乱程序的执行流程。需谨慎使用。