05-2基于vs2022的c语言笔记——表达式
目录
5-8-1表达式的概念
1.算术表达式
2.赋值表达式
2-1先介绍一个概念,表达式的结合性
2-2赋值表达式的结果是赋值符号有右边的值
3.关系表达式
4.逻辑表达式
4-1(a==0)&&(b==0)和!a&&!b等价
4-2一元运算符和二元运算符的优先级初识
5.逗号表达式
6.位表达式
5-8-2运算符的优先级
1.总结了几条规则,可以应对大多数情况,如果有特殊情况则查看表格
2.下面对一些表达式进行分析
5-8-3表达式的结合性
总结
前言
本套笔记是基于英雄哪里出来c语言入门到精通课程整理的笔记
包含代码,代码演示结果,以及便于理解的插图
对于想要c语言入门,嵌入式c语言的入门的朋友来说,这是一套不可多得的教程
此教程分几篇文章发布,初步计划更新到函数,未来时间允许会继续更新
5-8-1表达式的概念
表达式就是由运算符,常量,变量组合在一起的式子
1.算术表达式
#include <stdio.h>
int main() {
int a = 1, b = 2, c = 3, d = 4;
//a + b + c + d;
//a * b - c + d;
printf("%d\n", a + b + c + d);//10
printf("%d\n", a * b - c + d);//3
return 0;
}
2.赋值表达式
2-1先介绍一个概念,表达式的结合性
表达式的结合性是在表达式中,当多个运算符具有相同优先级时,用来确定计算顺序是怎样的。结合性可以分为左结合性和右结合性:
1. **左结合性**:运算符从左到右依次计算。例如,表达式 `a + b + c` 被解释为 `(a + b) + c`,因为加法运算符是左结合的
2. **右结合性**:运算符从右到左依次计算。例如,表达式 `a = b = c` 被解释为 `a = (b = c)`,因为赋值运算符是右结合的
a = (b = c) c的值赋值给b,b=c这个表达式的值赋值给a,那b=c这个表达式的值是多少呢?
请看2-2
2-2赋值表达式的结果是赋值符号有右边的值
这样的理论可以用来理解下面的代码
3.关系表达式
我们先来复习一下关系运算符都有哪些
>
>=
=
!=
<
<=
关系表达式的输出结果只有0和1两种,0表示带入数值后表达式不成立,1表示带入数值后表达式成立
具体演示如下
#include <stdio.h>
int main() {
int a = 0, b = 3, c = 3, d = 4;
printf("%d\n", a > b);//a > b显然不成立,输出0
printf("%d\n", a < b < c);
//注意关系表达式满足左结合性,也就是从左往右计算
//(a<b)<c a<b显然成立所以输出1 1<c也成立,所以最终输出1
printf("%d\n", a > b > c < d);//1
return 0;
}
4.逻辑表达式
其实就是逻辑运算符和变量,常量组合在一起的式子
我们这里举几个实例,以及对下一节课的运算符的优先级做一些引入
4-1(a==0)&&(b==0)和!a&&!b等价
为什么等价呢?我们从几个角度分析
1.运算符的含义
a==0 的返回值取决于a是否为0
a=0时,a==0返回1
a≠0时,a==0返回0
!a的返回值取决于a是否为0
a=0时,!a返回值为1
a≠0时,!a返回值为0
从这个角度来说,a==0与!a等价
2.等价性推导
a=0时,a==0返回值为1,!a返回值为1
a≠0时,a==0返回值为0,!a返回值为0
4-2一元运算符和二元运算符的优先级初识
一元运算符比二元运算符优先级高,因此无论!a和!b加不加括号,都是先算!a和!b
5.逗号表达式
看一个例子
6.位表达式
同样举个例子
5-8-2运算符的优先级
1.总结了几条规则,可以应对大多数情况,如果有特殊情况则查看表格
1.小括号的优先级最高,如果记不住其他运算符之间的优先级,就多加小括号。同时我们也习惯用小括号来体现和分析优先级,小括号里的优先级高
2.优先级,一元运算符>二元运算符>三元运算符
常见的一元运算符:!非 ~按位取反 ++自增 --自减
常见的二元运算符:算术运算符(+,-,*,/,%)赋值运算符(=,+=.-=,*=,/=,%=)关系运算符(==,!=,>,>=,<,<=)逻辑运算符(&&,||)逗号运算符(,)
位运算符(&,|,^,<<,>>)
唯一的三元运算符:条件运算符?: 在学完if语句后会详细介绍
3.算术运算符>关系运算符>位运算符>逻辑运算符
4.!>&&>||
5.逗号优先级最低,赋值符号次之。也就是记住逗号和赋值符号优先级排最后
2.下面对一些表达式进行分析
以下利用小括号来体现优先级,括号计算后缀自增和一元运算
例1:a||~b&&c++==d-2*a>7
1
c++:先取后加。
~b:对b按位取反。
2.处理算术运算
2*a:计算乘法。
d - (2*a):计算减法。
3.关系比较和等于判断
(d - 2*a) >7:结果为true(1)或false(0)。
c++ == (上述结果):比较c的原值是否等于上述结果
等于返回1,不等于返回0。
4.逻辑运算
~b && (c++ == ...)
a || (上述结果)
例2:!a||!b
1.先计算!a和!b
2.再进行逻辑或||运算
例3:a*2-b<c&&c*4-d*3==0
1.先计算算术运算符
(a*2-b)<c&&(c*4-d*3)==0
2.进行关系运算符判断
(a*2-b)<c --> 得出结果A 0或1 (c*4-d*3)==0 --> 得出结果B 0或1
3.结果A&&结果B
例4:!a||!b&&c
1.先计算!a和!b
2.再计算!b&& c--> 得出结果 0或1
3.!a||上述结果
例5:a=4,b=a=4,d=5,c=6;
(a=4),(b=a=4),(d=5),(c=6);
5-8-3表达式的结合性
基本介绍:
表达式的结合性是在表达式中,当多个运算符具有相同优先级时,用来确定计算顺序是怎样的。结合性可以分为左结合性和右结合性:
1. **左结合性**:运算符从左到右依次计算。例如,表达式 `a + b + c` 被解释为 `(a + b) + c`,因为加法运算符是左结合的
2. **右结合性**:运算符从右到左依次计算。例如,表达式 `a = b = c` 被解释为 `a = (b = c)`,因为赋值运算符是右结合的
注意满足左结合性的运算符很多,所以只用单独记忆满足右结合的运算符
1.单目运算符,也就是一元运算符 拿~按位取反来举例,~a,只有先得出a的值,才能进行按位取反操作,所以是从右往左计算的
2.条件运算符 ?:在第六章进行介绍
3.赋值运算符:
举个例子
总结
以上就是运算符和表达式的全部内容了(运算符的内容看基于vs2022的c语言笔记05-1——运算符)
运算符和表达式均是采用分类介绍的方法,实际上多种运算符之间组合,可以构成无数个表达式,都可以利用运算符,以及表达式的原则,优先级和结合性进行解决。
之后遇到什么新的运算符,以及表达式有需要注意的事项,遇到的时候再进行补充。