江小南
2022/11/20阅读:18主题:萌绿
【408篇】C语言笔记-第三章(运算符与表达式)
第三章:运算符与表达式
第一节:算数运算符与关系运算符
1. 运算符的分类
C语言提供了13中类型的运算符。
序号 | 类型 | 备注 |
---|---|---|
1 | 算数运算符 | + - * / % |
2 | 关系运算符 | > < == >= <= != |
3 | 逻辑运算符 | ! && || |
4 | 位运算符 | << >> ~ | ^ & |
5 | 赋值运算符 | =及其扩展赋值运算符 |
6 | 条件运算符 | ? : |
7 | 逗号运算符 | , |
8 | 指针运算符 | *和& |
9 | 求字节数运算符 | sizeof |
10 | 强制类型转换运算符 | (类型) |
11 | 分量运算符 | -> |
12 | 下标运算符 | [ ] |
13 | 其他运算符 | ( ) |
2. 算数运算符及算数表达式
乘、除、取余运算符的优先级高于加、减运算符。
%为取余(取模)运算符,它接收两个整型操作数,将左操作数除以右操作数,但它返回值是余数而不是商。
由算数运算符组成的式子称为算数表达式,表达式一定有一个值。
#include <stdio.h>
int main() {
int result=4+5*2-6/3+10%4;
printf("result=%d\n",result);
return 0;
}
F:\Computer\Project\practice\3\3.2-arithmetic\cmake-build-debug\3_2_arithmetic.exe
result=14
进程已结束,退出代码为 0
3. 关系运算符与关系表达式
由关系运算符组成的表达式称为关系表达式。关系表达式的值只有真和假,对应的值为1和0。
C语言中没有布尔类型,0代表假,非0即为真。
关系运算符的优先级低于算数运算符。
判断整型变量i是否等于3时,可以写成3==i,即把常量写在变量的前面,如果少写了一个等号会编译不通,便于发现问题。
编写程序时,如果要判断三个数是否相等,不能将三个数写到一起,if(5=5=5)的写法是错的。正确如下:
#include <stdio.h>
int main() {
int a;
while (scanf("%d",&a)){
if(a>3 && a<10){
printf("a is between 3 and 10\n");
} else{
printf("a is not between 3 and 10\n");
}
}
return 0;
}
F:\Computer\Project\practice\3\3.2-relation\cmake-build-debug\3_2_relation.exe
3
a is not between 3 and 10
5
a is between 3 and 10
m
进程已结束,退出代码为 0
解析:如果写成if(3<a<10),因为关系表达式的值只有0和1,这里a给成多少,3<a要么是0,要么是1,而0和1是小于10的,永远为真。
4. 运算符的优先级

说明:同一优先级的运算符,运算次序由结合方向所决定。
简单记就是:! > 算数运算符 > 关系运算符 > && > || > 赋值运算符。
第二节:逻辑运算符与赋值运算符
1. 逻辑运算符与逻辑表达式
非:!
与:&&
或:||
和数学上的与或非一致。
逻辑非的优先级高于算数运算符,逻辑与和逻辑或的优先级低于关系运算符。
对0取非,得到的值为1,对非0值取非,得到的值为0。
逻辑与短路运算是当前面一个表达式为假时,后面的表达式不会执行。逻辑或短路运算是当前面一个表达式为真时,后面的表达式不会执行。
#include <stdio.h>
int main() {
int i=0,j=1;
while (scanf("%d",&i)){
if(i%4==0 && i%100!=0 || i%400==0){
printf("i is leap year\n");
} else{
printf("i is not leap year\n");
}
}
i=!!j;
printf("i=%d\n",i);
return 0;
}
F:\Computer\Project\practice\3\3.3-leap_year\cmake-build-debug\3_3_leap_year.exe
2000
i is leap year
1000
i is not leap year
m
i=1
进程已结束,退出代码为 0
解析:最后输入了非零的m,第一步!j为0,而后!!j为1。
#include <stdio.h>
int main() {
int i=0;
i&& printf("you can not see me\n");
return 0;
}
F:\Computer\Project\practice\3\3.3-short_circuit\cmake-build-debug\3_3_short_circuit.exe
进程已结束,退出代码为 0
解析:没有任何输出,因为i=0就是假,不执行后面的了,短路。
2. 赋值运算符
左值是那些出现在赋值符号左边的东西,右值是那些可以出现在赋值符号右边的东西。
a=b+25; 是合法的。
b+25=a; 是不合法的。因为b+25并未标识一个特定的位置(并不对应特定的内存空间)。
#include <stdio.h>
int main() {
int a=1,b=2;
b+25=a;
return 0;
}
F:\Computer\Project\practice\3\3.3-logic\main.c:5:9: error: lvalue required as left operand of assignment
b+25=a;
^
符合赋值运算符:
例如:
i=i+5可以写成i+=5;
i=i*5可以写成i*=5;
#include <stdio.h>
// 加后赋值和乘后赋值
int main() {
int iNum,iResult;
iNum=10;
iResult=3;
iNum+=5;
iResult*=iNum;
printf("iNun=%d\n",iNum);
printf("iResult=%d\n",iResult);
return 0;
}
F:\Computer\Project\practice\3\3.3-reunite_with\cmake-build-debug\3_3_reunite_with.exe
iNun=15
iResult=45
进程已结束,退出代码为 0
3. 求字节运算符sizeof
用于求常量或变量所占用的空间大小。
#include <stdio.h>
int main() {
int i=0;
printf("i sizeof is %d\n",sizeof(i));
return 0;
}
F:\Computer\Project\practice\3\3.2-sizeof\cmake-build-debug\3_2_sizeof.exe
i sizeof is 4
进程已结束,退出代码为 0
可以看出整型变量占用空间大小为4个字节。
作者介绍