写在前面:学习的第一门语言是Java,之前对C也了解一点,也只是了解一点,在加上长时间没有接触了,基本就只会一个Hello World了。现在由于准备升本考试,不得不从头开始学C。这里从零开始,记录C语言学习点滴。欢迎正在学习C语言的小伙伴一起学习,未来可期,一起加油!
前面几篇也讲述了部分运算符和表达式。比较零散,这里对运算符与表达式总结整理一下。
文章目录
- 算术表达式
- 1、算术运算符
- 2、自增自减运算符
- 3、 算术运算符的优先级
- 赋值表达式
- 关系表达式
- 逻辑表达式
- 条件表达式
- 逗号表达式
- 其他运算
算术表达式
1、算术运算符
算术运算符分为单目运算符合双目运算符两类,单目运算符只需要一个操作数,而双目运算符需要两个操作数(下表为常用的算术运算符)。
目数 | 单目 | 单目 | 单目 | 单目 | 双目 | 双目 | 双目 | 双目 | 双目 |
---|
运算符 | ++ | - - | + | - | + | - | * | / | % |
名称 | 自增 | 自减 | 正值 | 负值 | 加 | 减 | 乘 | 除 | 取余 |
2、自增自减运算符
自增自减运算都是对变量进行+1或者-1操作。
例如(n为变量):++n和n++都相当于n = n + 1;
–n和n–都相当于n = n - 1;
从上面案例中是不是觉得自增自减运算符放在变量前或后都是一样。单独做运算的确是一样的,但如果放在表达式中,就有区别了。
例如:
#includeint main(){int a = 1, b = 1, c = 3;a++;--b;/* a = 2, b = 0 */printf("a = %d, b = %d\n", a, b);a = 2;b = 2;/*先进行a * c运算,之后a在自增1*/printf("a++ * c = %d\n", a++ * c);/* b先自增1,在进行b * c运算 */printf("++b * c = %d\n", ++b * c);printf("a = %d, b = %d\n", a, b);return 0;
}
运行结果如下:
由上述案例可以清楚的看出,自增自减运算符单独做运算,运算符放在前后都是一样的。但如果放在表达式中。
如果自增自减运算符放在变量前面,则先自增或自减后在进行表达式运算。
如果自增自减运算符放在变量后面,则进行表达式运算在进行自增或自减。
3、 算术运算符的优先级
在算术四则运算中,需要遵循“先乘除后加减”的运算规则。同样,在计算表达式的值时,也需要按照运算符的优先级从高到低顺序计算。
例如:表达式a + b * c需要先计算b * c。因为 * 运算符的优先级高于 + 运算符。
如果操作数两侧运算符优先级相同,则按照“从左到右”的方向进行计算。
下表为部分运算符的优先级(从下到上,最上方的优先级最高)
运算符种类 | 运算符 |
---|
逻辑运算符 | ! |
算术运算符 | ++、 - - 、+ 、- (单目) |
算术运算符 | +、/ 、 % (双目) |
算术运算符 | + 、 - (双目) |
关系运算符 | <、 <&#61; 、 > 、 >&#61; |
关系运算符 | &#61; &#61; 、 ! &#61; |
逻辑运算符 | &&、|| |
条件表达式 | &#xff1f;&#xff1a; |
赋值运算符 | &#61; 、 &#43;&#61; 、-&#61; 、 *&#61; 、 /&#61; 、 %&#61; |
逗号运算符 | , |
上述的运算符优先级顺序为从下到上&#xff08;最上方的运算符优先级最高&#xff09;。上述运算符大部分之前都使用过&#xff0c;少部分没有见过的&#xff0c;下面会一一讲解。
赋值表达式
C语言将赋值作为一种运算&#xff0c;赋值运算符 &#61; 的左边必须是一个变量&#xff0c;作用是把一个表达式表达式的值赋给一个变量。
1、赋值表达式
用赋值运算符将一个变量和一个表达式链接起来的式子称为赋值表达式。赋值表达式的简单形式是&#xff1a;变量 &#61; 表达式
赋值表达式的运算过程&#xff1a;
- 计算赋值运算符右侧表达式的值。
- 将赋值运算符右侧表达式的值赋给赋值运算符左侧的变量。
- 将赋值运算符左侧的变量的值作为赋值表达式的值。
在赋值运算时&#xff0c;如果赋值运算符两侧的数据类型不同&#xff0c;在上述运算过程的第二步&#xff0c;系统首先会将赋值运算符右侧表达式的类型自动转换成赋值运算符左侧变量的类型&#xff0c;在给变量赋值&#xff0c;并将变量的类型作为赋值表达式的类型。
例如&#xff1a;
#includeint main(){int a &#61; 2, b, c &#61; 3;float f &#61; 1.2;b &#61; a * c; /* 将a*c的值赋给b------b &#61; 6 */printf("b &#61; %d\n", b);/* 将浮点型的 f 数据值赋值给b-----b &#61; 1 */b &#61; f;printf("b &#61; %d\n", b);return 0;
}
运行结果如下&#xff1a;
2、复合赋值运算符
赋值运算符分为简单的赋值运算符就是 &#61; (上述为简单的赋值运算符)&#xff0c;和复合赋值运算符&#xff0c;在&#61; 前加上算术运算符&#xff08;如下表&#xff09;。
运算符 | 名词 | 等价关系 |
---|
&#43; &#61; | 加赋值 | a &#43;&#61; b 等价于 a &#61; a &#43; b |
- &#61; | 减赋值 | a -&#61; b 等价于 a &#61; a - b |
* &#61; | 乘赋值 | a *&#61; b 等价于 a &#61; a * b |
/ &#61; | 除赋值 | a /&#61; b 等价于 a / &#61; b |
% &#61; | 取余赋值 | a %&#61; b 等价于 a &#61; a % b |
【注】b可以为变量也可以为表达式&#xff0c;表达式需要加括号。
例如&#xff1a;x *&#61; y -3等价于x &#61; x * (y - 3)
关系表达式
1、关系运算符
关系运算符是双目运算符&#xff0c;用于对两个操作数进行比较。关系运算符如下&#xff1a;
运算符 | < | <&#61; | > | >&#61; | &#61; &#61; | ! &#61; |
---|
名称 | 小于 | 小于或等于 | 大于 | 大于或等于 | 等于 | 不等于 |
关系运算符的优先级低于算术运算符&#xff0c;高于赋值运算符和逗号运算符(可以参考上面运算符优先级表)。
例如&#xff1a;假设a、b、c、d是整数变量&#xff0c;ch是字符型变量。则&#xff1a;
- a > b &#61;&#61; c 等价于&#xff08;a > b&#xff09;&#61;&#61; c。
- c &#61; a > b 等价于 c &#61; (a > b)。
- ch > ‘a’ &#43; 1 等价于 c&#61; &#xff08;‘a’ &#43; 1&#xff09;。
- d &#61; a &#43; b > c 等价于 d &#61; ((a &#43; b) > c)。
- 3 <&#61; a <&#61; 5 等价于&#xff08;3 <&#61; a&#xff09;<&#61; 5。
- b - 1 &#61;&#61; a !&#61; c 等价于 &#xff08;(b - 1) &#61;&#61; a&#xff09; !&#61; c。
2、关系表达式
用关系运算符将两个表达式链接起来的式子为关系表达式。关系表达式的值反映了关系运算(比较)的结果&#xff0c;它是一个逻辑量&#xff0c;取值“真”或“假”。整数 1 代表“真”&#xff0c;0代表“假”。类型都为整形。
关系表达式的运用&#xff0c;如下(一般运用在分支结构中)&#xff1a;
#includeint main(){char ch &#61; &#39;w&#39;;int a &#61; 2, b &#61; 3, c &#61; 1, d, x &#61; 10;/* 2 > 3 &#61;&#61; 1 结果为假&#xff0c;输出0 */printf("%d\t", a > b &#61;&#61; c);/* d &#61; 2 > 3 2 > 3为假&#xff0c;所以d&#61;0&#xff0c;输出0*/printf("%d\t", d &#61; a > b);/* ch > &#39;a&#39; &#43; 1 &#39;a&#39; &#43; 1 &#61; &#39;b&#39; &#39;w&#39; > &#39;b&#39; 结果为真&#xff0c;输出1*/printf("%d\t", ch > &#39;a&#39; &#43; 1);/* d &#61; 2 &#43; 3 > 1 b &#61; 5 > 1 结果为真&#xff0c;输出1 */printf("%d\t", d &#61; a &#43; b > c);/* 3-1 &#61;&#61; 2 !&#61; 1 2 &#61;&#61; 2 !&#61; 1 1 !&#61; 1 结果为假&#xff0c;输出0 */printf("%d\t", b - 1 &#61;&#61; a !&#61; c);/* 3 <&#61; 10 <&#61; 5 1 <&#61; 5 结果为真&#xff0c;输出1 */printf("%d\n", 3 <&#61; x <&#61; 5);return 0;
}
运行结果如下&#xff1a;
【注】因为关系表达式都属于同级&#xff0c;所以从左向右运行。
逻辑表达式
1、逻辑运算符
C语言中有三种逻辑运算符(如下表)&#xff0c;逻辑运算对象可以是关系表达式或逻辑量&#xff0c;逻辑运算的结果也是一个逻辑量&#xff0c;与关系运算一样&#xff0c;用整数 1 代表“真”&#xff0c;0 代表“假”。
目数 | 单目 | 双目 | 双目 |
---|
运算符 | &#xff01; | && | || |
名称 | 逻辑非 | 逻辑与 | 逻辑或 |
假设 a 和 b 是逻辑量&#xff0c;则对 a 和 b 可以进行的基本逻辑运算包括 !a 或 !b、a && b 和 a || b 三种&#xff0c;具体运算值如下(1 表示 “真”&#xff0c;0 表示 “假”)&#xff1a;
a | b | !a | a && b | a || c |
---|
1 | 1 | 0 | 1 | 1 |
1 | 0 | 0 | 0 | 1 |
0 | 1 | 1 | 0 | 1 |
0 | 0 | 1 | 0 | 0 |
上述清楚地说明了逻辑运算符的功能&#xff0c;即&#xff1a;
- ! a&#xff1a;如果a为“真”&#xff0c;结果为0(“假”)&#xff1b;如果a为“假”&#xff0c;结果为1(“真”)。
- a && b&#xff1a;当a 和 b都为“真”时&#xff0c;结果为1(“真”)&#xff1b;否则&#xff0c;结果为0(“假”)。
- a || b&#xff1a;当a 和 b 都为“假”时&#xff0c;结果为0(“假”)&#xff1b;否则&#xff0c;结果为1(“真”)。
【注】同时使用逻辑表达式时**&&逻辑与的优先级要高于||逻辑或**。可以参考上面的游优先级表。
2、逻辑表达式
用逻辑运算符将关系表达式或逻辑量链接起来的式子为逻辑表达式。逻辑运算对象是值为“真”或“假”的逻辑量&#xff0c;可以是任何类型的数据&#xff0c;如整形、浮点型、字符型等。逻辑运算结果&#xff0c;同样也是1(“真”) 或 0(“假”)。
逻辑运算示例如下&#xff1a;
#includeint main(){char ch &#61; &#39;w&#39;;int a &#61; 2, b &#61; 0, c &#61; 0;float x &#61; 3.0;/* 2 && b 真 && 假 非0都为真&#xff0c;输出结果为0*/printf("%d\t", a && b);/* 2 || 0 && 0 结果为1 */printf("%d\t", a || b && c);/* !2 && 0 !取反&#xff01;的优先级比&&逻辑与高一些&#xff0c;结果为0 */printf("%d\t", !a && b);/* 2 || 13 && 2 结果为1 */printf("%d\t", a || 3&#43;10 && 2);/* !(3.0 &#61;&#61; 1) 结果为1 */printf("%d\t", !(x &#61;&#61; 1));/* !2 &#61;&#61; 2 结果为0 */printf("%d\t", !x &#61;&#61; 2);/* &#39;w&#39; || b &#39;w&#39;的值为正&#xff0c;结果为1 */printf("%d\n", ch || b);return 0;
}
运算结果如&#xff1a;
条件表达式
1、条件表达式
条件运算符是一个三目运算符&#xff0c;它将三个表达式链接在一起&#xff0c;组成条件表达式。条件表达式的一般形式为&#xff1a;
表达式1 &#xff1f; 表达式2 &#xff1a; 表达式3
条件表达式的运算过程是&#xff1a;先计算表达式1的值&#xff0c;如果他的值为非0&#xff08;真&#xff09;&#xff0c;将表达式2的值作为条件表达式的值&#xff0c;否则&#xff0c;将表达式3的值作为条件表达式的值。
例如&#xff1a;设a、b是整形变量&#xff0c;将a、b的最大值赋给z。可以用if语句实现&#xff1a;
if(a > b){z &#61; a;
}else {z &#61; b;
}
也可以用条件表达式来实现&#xff1a;
z &#61; &#xff08;a > b&#xff09;? a: b;
条件表达式在部分情况下&#xff0c;可以代替if语句。灵活的使用条件表达式&#xff0c;不但可以使程序简单明了&#xff0c;而且还能提高运算效率。
逗号表达式
1、逗号表达式
逗号既可以作分隔符&#xff0c;又可以作运算符。逗号作为分隔符使用时&#xff0c;用于间隔说明语句中的变量或函数中的参数&#xff0c;例如&#xff1a;
int a, b, c;
printf("%d %d", a, b);
逗号作为运算符使用时&#xff0c;将若干个独立的表达式链接在一起&#xff0c;组成逗号表达式。逗号表达式的一般形式为&#xff1a;
表达式1&#xff0c;表达式2&#xff0c;…&#xff0c;表达式n
逗号表达式的运算过程是&#xff1a;先计算表达式1的值&#xff0c;然后计算表达式2的值…最后计算表达式n的值&#xff0c;并将表达式n的值作为逗号表达式的值&#xff0c;将表达式n的类型作为逗号表达式的类型。
其他运算
1、长度运算
长度运算符sizeof是一个单目运算符。用来返回变量或数据类型的字节长度。
例如&#xff1a;设a是整形变量&#xff0c;则sizeof(a)计算整形变量a的长度&#xff0c;值为4(bytes)&#xff0c;sizeof(int)计算整形的长度&#xff0c;值为4(bytes)。可以用于计算数组长度&#xff0c;后面数组章节会详细讲解。
2、特殊运算符
在C语言中还有一些特殊的、具有专门用途的运算符。如(部分没有使用过&#xff0c;后面章节会详细讲解)&#xff1a;
- () 括号&#xff1a;用来改变运算符顺序。
- [] 下标&#xff1a;用来表示数组元素。
- *和 &&#xff1a;与指针运算有关。
- ->和 . :用来表示结构衡量。
由于初学C语言&#xff0c;上述内容如有错误地方&#xff0c;恳请各位大佬指出&#xff01;