5.1 运算符和运算符
5.1.1逻辑运算发
运算符 | 说明 | 结核性 | 举例 |
---|---|---|---|
&& | 与运算,双目,对应数学中的“且” | 左结合 | 1&&0、(9>3)&&(b>a |
与运算,双目,对应数学中的“且” | 左结合 | 1 | |
! | 非运算,单目,对应数学中的“非” | 右结合 | !a、!(2<5) |
举例
#include <stdio.h>
int main(){int a = 0, b = 10, c = -6;int result_1 = a&&b, result_2 = c||0;printf("%d, %d\n", result_1, !c);printf("%d, %d\n", 9&&0, result_2);printf("%d, %d\n", b||100, 0&&0);return 0;
}
运行结果:
0, 0
0, 1
1, 0
5.1.2 关系运算符
关系运算符在使用时,它的的两边都会有一个表达式,比如变量、数值、加减乘除运算等,关系运算符的作用就是判明这两个表达式的大小关系。注意,是判明大小关系,不是其他关系。
关系运算符 | 含义 | 数学中的表示 |
---|---|---|
< | 小于 | < |
<= | 小于或等于 | ≤ |
> | 大于 | > |
>= | 大于或等于 | ≥ |
== | 等于 | = |
!= | 不等于 | ≠ |
举例
#include <stdio.h>
int main(){char c='k';int i=1, j=2, k=3;float x=3e+5, y=0.85;int result_1 = 'a'+5<c, result_2 = x-5.25<=x+y;printf( "%d, %d\n", result_1, -i-2*j>=k+1 );printf( "%d, %d\n", 1<j<5, result_2 );printf( "%d, %d\n", i+j+k==-2*j, k==j==i+5 );return 0;
}
运行结果:
1, 0
1, 1
0, 0
注意
需要提醒的是,==才表示等于,而=表示赋值,大家要注意区分,切勿混淆。
5.1.3 条件运算符
格式
表达式1 ? 表达式2 : 表达式3
结合方向
自右向左
举例
#include <stdio.h>
int main(){int a, b;printf("Input two numbers:");scanf("%d %d", &a, &b);printf("max=%d\n", a>b?a:b);return 0;
}
运行结果:
Input two numbers:23 45
max=45
5.1.4 优先级
赋值运算符(=) < &&和|| < 关系运算符 < 算术运算符 < 非(!)
举例
#include <stdio.h>
int main(){char c='k';int i=1,j=2,k=3;float x=3e+5,y=0.85;printf( "%d,%d\n", !x*!y, !!!x );printf( "%d,%d\n", x||i&&j-3, i<j&&x<y );printf( "%d,%d\n", i==5&&c&&(j=8), x+y||i+j+k );return 0;
}
运行结果:
0,0
1,0
0,1
5.2 if-else 选择结构
用法
### 用法1
if(判断条件){语句块1
}else{语句块2
}
等效图
用法2
if(判断条件){
语句块
}
等效图
用法3:多分支
if(判断条件1){
语句块1
} else if(判断条件2){
语句块2
}else if(判断条件3){
语句块3
}else if(判断条件m){
语句块m
}else{
语句块n
}
用法4 :嵌套
```#include <stdio.h>int main(){int a,b;printf("Input two numbers:");scanf("%d %d",&a,&b);if(a!=b){ //!=表示不等于if(a>b) printf("a>b\n");else printf("a<b\n");}else{printf("a=b\n");}return 0;}
运行结果:
Input two numbers:12 68
a<b
5.3 switch-case 选择结构
格式
switch(表达式){
case 整型数值1: 语句 1;
case 整型数值2: 语句 2;
…
case 整型数值n: 语句 n;
default: 语句 n+1;
}
需要重点强调的是,当和某个整型数值匹配成功后,会执行该分支以及后面所有分支的语句。
break 是C语言中的一个关键字,专门用于跳出 switch 语句。
case 后面必须是一个整数,或者是结果为整数的表达式,但不能包含任何变量。请看下面的例子:
case 10: printf("..."); break; //正确
case 8+9: printf("..."); break; //正确
case 'A': printf("..."); break; //正确,字符和整数可以相互转换
case 'A'+19: printf("..."); break; //正确,字符和整数可以相互转换
case 9.5: printf("..."); break; //错误,不能为小数
case a: printf("..."); break; //错误,不能包含变量
case a+10: printf("..."); break; //错误,不能包含变量
default 不是必须的。当没有 default 时,如果所有 case 都匹配失败,那么就什么都不执行
5.4 while循环结构
while循环
格式
while(表达式){
语句块
}
我们通常将“表达式”称为循环条件,把“语句块”称为循环体,整个循环的过程就是不停判断循环条件、并执行循环体代码的过程。
举例
#include <stdio.h>
int main(){int i=1, sum=0;while(i<=100){sum+=i;i++;}printf("%d\n",sum);return 0;
}
do-while
格式
do{
语句块
}while(表达式);
举例
#include <stdio.h>
int main(){int i=1, sum=0;do{sum+=i;i++;}while(i<=100);printf("%d\n", sum);return 0;
}
for 循环
格式
for(表达式1; 表达式2; 表达式3){
语句块
}
等效图
举例
#include <stdio.h>
int main(){int i, sum=0;for(i=1; i<=100; i++){sum+=i;}printf("%d\n",sum);return 0;
}
5.6 循环嵌套和跳出
break
举例
#include <stdio.h>
int main(){int i=1, j;while(1){ // 外层循环j=1;while(1){ // 内层循环printf("%-4d", i*j);j++;if(j>4) break; //跳出内层循环}printf("\n");i++;if(i>4) break; // 跳出外层循环}return 0;
}
运行结果:
1 2 3 4
2 4 6 8
3 6 9 12
4 8 12 16
continue
举例
#include <stdio.h>
int main(){char c = 0;while(c!='\n'){ //回车键结束循环c=getchar();if(c=='4' || c=='5'){ //按下的是数字键4或5continue; //跳过当次循环,进入下次循环}putchar(c);}return 0;
}
运行结果:
0123456789↙
01236789
嵌套
举例
#include <stdio.h>
int main()
{int i, j;for(i=1; i<=4; i++){ //外层for循环for(j=1; j<=4; j++){ //内层for循环printf("%-4d", i*j);}printf("\n");}return 0;
}
运行结果:
1 2 3 4
2 4 6 8
3 6 9 12
4 8 12 16
5.7 总结
最后还要注意 break 和 continue 关键字用于循环结构时的区别:
break 用来跳出所有循环,循环语句不再有执行的机会;
continue 用来结束本次循环,直接跳到下一次循环,如果循环条件成立,还会继续循环。