下面为大家分享自己近期在学习c语言分支和循环结构时候总结的一些知识点盲区
1.如果有多个if和else,else总是和最接近的if匹配
例:
int main()
{
int a = 10;
int b = 20;
if (a == 1)
if (b == 2)
printf("haha\n");
else
printf("hehe\n");
return 0;
}
如果你上来就判断a是10不等于1,然后执行else语句,打印hehe,但是如果你去运行代码就发现什么也没输出。输出见下图。
这是因为如果有多个if和else,else总是和最接近的if匹配,所以上 else 是和第二个 if 进行匹配的,这样后边的 if...else 语句是嵌套在第⼀个 if 语句中的,如果第⼀个 if 语句就不 成立,嵌套 if 和 else 就没机会执行了,最终啥都不打印。其实上述代码可以写成如下:
int main()
{
int a = 10;
int b = 20;
if (a == 1)
{
if (b == 2)
printf("haha\n");
else
printf("hehe\n");
}
return 0;
}
2.if(x == 3)与if(x=3)完全不一样,后者表示对变量 x 赋值 3 ,它的返 回值为 3 ,所以 if 判断总是为真,为防止这种错误可以将变量写在等号右边if(3==x),这样如果将==写成=,编译器会报错。
3.多个运算符不宜连用,i < j < k ,并不是保证变量 j 在 i 和 k 之间,因为运算符是从左往右运算,执行的是如下表达式 ( i < j ) < k ,其中 i < j 返回0或1,最终是 0 或 1与 k 进行比较。如果想要判断 j 是否在i和k之间,可以使用 i<j && j<k这种用法。
4.三目操作符 exp1 ? exp2: exp3; 如果exp1表达式为真,执行exp2,exp2结果为整个表达式结果;如果exp1表达式为假,执行exp3,exp3结果为整个表达式结果。
5.c语言的逻辑运算符先对左边表达式求值,再对右边表达式求值。如果左边的表达式满足逻辑运算符的条件,就不再对右边的表达式求值。这种情况称为短路。
对于&&操作符,例如:if(a>=5&&a<=10),当左边的操作数a>=5的结果为0时,即使不判断右边操作数a<=10,整个表达式的结果也为0。故对于&&操作符来说,左边的操作数结果是0时,右边的操作数不在执行。
对于||操作符,当左边的操作数结果不为0时,就无需执行右操作数
例:
#include <stdio.h>
int main()
{
int i = 0,a=0,b=2,c =3,d=4;
i = a++ && ++b && d++;//a = 1 ,b = 2,c = 3,d = 4,i=0
//i = a++||++b||d++;//a = 1, b = 3,, c = 3 ,d=4 ,i=1
printf("a = %d\n b = %d\n c = %d\nd = %d\n", a, b, c, d);
return 0;
}
6.下面是switch的结构
switch (expression) {
case value1: statement
case value2: statement
default: statement
}
注意switch 后的 expression 必须是整型表达式 ;case 后的值,必须是整形常量表达式。
case 和后边的数字之间必须有空格
每⼀个 case 语句中的代码执行完成后,需要加上 break ,才能跳出这个switch语句。在switch语句中,case子句和default子句没有顺序要求,只要顺序满足实际需求即可,通常是把default子句放在最后。
7.for循环的初始化,判断,调整三个表达式都可以省略,但是要注意如果省略了表示判断的部分,恒为真。
8.break和continue
break的作用是永久终止循环,只要 break 被执行,直接就会跳出循环,继续往后执行。只要break 被执行, break 外的第⼀层循环就终止了。continue 的作用是跳过本次循环 continue 后边的代码,继续进行下⼀次循环的判断,在 for 循环和 while 循环中有所差异的。f
下面是一个continue的代码:
int main()
{
int i = 0;
while (i <= 10)
{
if (i == 5)
continue;
printf("%d ", i);
i++;
}
return 0;
}
这里循环的调整是在 continue 后边,continue跳过了后边的调整部分会造成死循环。
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
if (i == 5)
continue;
printf("%d ", i);
}
return 0;
}
这里continue跳过了后边的打印,直接来到了i++的调整部分。所以不会造成死循环
9.goto语句,goto 语句可以实现在同⼀个函数内跳转到设置好的标号处。注意是在同一个函数内。
一般形式如下:
.
.
goto falg;
.
.
.
flag:
.
.
.
for (...)
{
for (...)
{
for (...)
{
if (disaster)
goto error;
}
}
}
error:
//...