C语言程序设计(二)
文章目录
判断(if)
if(条件成立){
......
};
⼀个基本的if语句由一个关键字
if
开头,跟上在括号里的一个表示条件的逻辑表达式,然后是一对大括号“{}
”之间的若干条语句。如果表示条件的逻辑表达式的结果不是零,那么就执行后面跟着的这对大括号中的语句,否则就跳过这些语句不执行,而继续下面的其他语句。(则逻辑表达式结果为0就是条件不成立;不为0就是条件成立)
if ( total > amount )
total += amount+10;if语句这⼀行结束的时候并没有表示语句结束的“
;
”,而后面的赋值语句写在if的下一行,并且缩进了,在这⼀行结束的时候有一个表示语句结束的“;
”。这表明这条赋值语句是if语句的一部分,if语句拥有和控制这条赋值语句,决定它是否要被执行。
判断的条件
条件
- 计算两个值之间的关系,所以叫关系运算符
运算符 | 意义 |
---|---|
== | 相等 |
!= | 不相等 |
> | 大于 |
>= | 大于或等于 |
< | 小于 |
<= | 小于或等于 |
关系运算的结果
-
当两个值的关系符合关系运算符的预期时,关系运算的结果为整数1,否则为整数0
-
比如:printf("%d\n", 5==3); 输出结果为0 printf("%d\n", 5>3); 输出结果为1
优先级
- 所有的关系运算符的优先级比算术运算的低,但是比赋值运算符的高
- 7 >= 3+4 ; int r = a>0;
注释(/* */)
- 延续数行的注释,要用多行注释的格式来写。多行注释由一对字符序列”
/*
" 开始,而以"*/
"结束。 - 也可以用一行内注释
int ak = 47/* 36*/, y = 9
- 也可以用
//
来注释一行
//初始化
int a = 0;
int b = 1;
否则(else)
if(条件成立){ //条件成立时输出的结果
........
}else{.......} //条件不成立时输出的结果
嵌套的if
嵌套的判断
-
当if的条件满足或者不满足的时候要执行的语句也可以是⼀条
if
或if-else
语句,这就是嵌套的if语句 -
else 总是和最近的那个if匹配
-
if(条件一) if(条件二) printf(......); else printf(......); else printf(......);
-
tips : ① 在 if 或 else 后面总是用{} ② 即使只有一条语句的时候;
级联的 if - else if
if(exp1)
stl;
else if(exp2)
st2;
else
st3;
if语句常见错误
-
忘记大括号{}
-
if (age >12) salary = salary * 1.2; printf("%f",salay);
-
不管这个 if 判断是否成立都会执行 printf 这行语句,如果需要判断成立再执行则需要加个大括号
-
if (age >12){ salary = salary * 1.2; printf("%f",salay); }
-
注意:在c语言的编译器中,缩进、空格和回车并不能将后面的语句划分到前面那句,即不会理会缩进、空格和回车带来的后果。大部分都是用分号
;
或者大括号{}
来划分语句, python 语言不同, 他们是严格按照缩进来进行语句划分而不会使用分号来划分。
-
-
永远在if和else后面加上大括号{},即使只有一条语句
-
if后面的分号
- if()后面不接分号,接分号则表示条件成立什么也不做,这样没有意义。
-
错误使用==和=
==
等于 ;=
赋值- if只要求()里面的值是零或非零;即括号内逻辑表达式的结果
-
使人困惑的else
-
else总是和最近的那个if匹配
-
if(a > 0){ if (b<1) printf(a); }else{ printf(b); }
-
带大括号{}的if,else跟大括号的if
-
if(a>0) if(b<1) printf(a); else print(b);
-
if没带大括号,则 else 跟最近的 if 匹配
-
代码风格习惯
-
if和else之后必须加上大括号形成语句块;(虽然单个语句可以不加括号,但为了代码的规范化还是要加上大括号形成语句块, 其次防止出错)
-
大括号内的语句缩进一个Tab键的位置;
三种风格代码
第一种 :
if ( x<0 ){ f = -1; }else if( x == 0){ f = 0; }else{ f = 2 * x; }
- 早期电脑的显示器因为长度不够,为了尽可能显示更多行代码的内容而采用的代码风格
第二种 :
if ( x<0 ) { f = -1; }else if( x == 0) { f = 0; }else { f = 2 * x; }
第三种 :
if ( x<0 ) { f = -1; } else if( x == 0) { f = 0; } else { f = 2 * x; }
- 第二种和第三种的主要区别在于注释掉代码时,第三种不会影响代码的逻辑关系
举个栗子 :
//第二种: if ( x<0 ) { f = -1; //}else if( x == 0) //即后面少了}括号 //{ // f = 0; }else { f = 2 * x; } //第三种: if ( x<0 ) { f = -1; } //else if( x == 0) //这样并不会影响代码的语法 //{ // f = 0; //} else { f = 2 * x; }
多路分支(switch-case)
switch(控制表达式){
case 常量:
语句;
.....;
case 常量:
语句;
.....;
default:
语句;
......;
}
switch-case
-
控制表达式只能是
整数型(int)
的结果-
也可以用常量整数型量 如: const int a = 2; case a :
注:C99才能用,C99之前的编译器不能用
-
-
常量可以是常数,也可以是常数计算的表达式
-
根据表达式的结果,寻找匹配的case,并执行case后面的语句,⼀直到break为止
-
如果所有的case都不匹配,那么就执行default后面的语句;如果没有default,那么就什么都不做
break
- switch语句可以看作是⼀种基于计算的跳转,计算控制表达式的值后,程序会跳转到相匹配的 case(分支标号)处。分支标号只是说明 switch 内部位置的路标,在执行完分支中的最后一条语句后,如果后面没有break,就会顺序执行到下面的case里去,直到遇到一个break,或者switch结束为止
举个栗子:
if (type == 1){
printf("你好");
}else if(type == 2){
printf("早上好");
}else if(type == 3){
printf("晚上好");
}else if(type == 4){
printf("再见");
}else{
printf("啊你个头啊");
}
用switch-case表示
switch(type){
case 1:
printf("你好");
break;
case 2:
printf("早上好");
break;
case 3:
printf("晚上好");
break;
case 4:
printf("再见");
default:
printf("啊你个头啊");
}
-
if-else和switch-case区别
- if-else 是从上到下的语句进行判断, 其判断可以不是整型的结果
- 而switch并不是从第一个到第n个case这样进行判断,而是直接可以到第n个的情况那里输出(可以进行断点调试看看其跳转情况)
-
还有一个误区,就是为啥不一直写if, if, if…, 而是要写if, else if, else if, …, else.
- 原因是if, if, if他们是没有关联的判断,而if, else if, …, else是在前面那些if的基础上再进行判断, 是有关联的(他们的关系更多像补集的关系)。
练习
f(x) = -1; x<0
f(x) = 0; x = 0
f(x) = 2x; x>0
这个分段函数能否用switch-case?
int a = 0;
int b = 0;
a = x >0;
b = x <0;
switch (a - b){
case -1:
printf("f(x)=%d\n",-1);
break;
case 1:
printf("f(x)=%d\n",2*x);
break;
default:
printf("f(x)=%d\n",0);
break;
}
return 0;
}
其中a = x>0
b = x<0
关系运算符的优先级比赋值运算符的高
若x>0则运算结果为1,否者为0赋值给a (相当于True和False;1,0)
若x<0则运算结果为1,否者为0赋值给b (相当于True和False;1,0)
可忽略
- switch的汇编代码
if-else的汇编代码