C语言表达式和运算符
「今天是学习C语言第 13 天」
# 1.基本概念
C语言提供多种运算符,可以对各种变量和常量进行运算。
表达式是运算符、变量、常量的组合,表达式可以求值。
表达式中会出现多种运算符,计算顺序由运算符的优先级决定,同级的运算符计算顺序由结合性决定。
圆括号 () 可以显式改变计算顺序,括号内表达式被优先计算。
C语言规定运算符优先级从高到低计算,结合性从左到右、从右到左。
一元运算符:需要一个操作数运算;二元运算符:需要两个操作数运算;三元运算符:需要三个操作数运算。
注:表达式和运算符分类基本对应,下面按照优先级依次学习。
# 初等表达式:基本的表达式
变量或函数标识符
常量
字符串字面值
例如 int y = x + 10;
其中x是变量标识符,是初等表达式,值为变量x当前的值;
10是整数常量,也是表达式,值为10;
"abcd" 字符串也是初等表达式,值为指向char类型的指针;
# 括号表达式:不改变表达式的值
(表达式)
对任意的表达式加(),不改变()内表达式的值,仅改变复合表达式中计算顺序。
# 后缀表达式 6种:
数组下标[]
函数调用()
结构或联合直接成员选择.
结构和联合间接成员选择->
后缀自增++
后缀自减--
例如
int a[2] ={0,1}; // a[0]是下标表达式,值为0;
int sum(int a, int b) {return a+b;}; // sum(1,2)是函数调用表达式,值为3
struct Student {
char *name;
int age;
} student;
student.age 直接访问成员age的值
sutdent->name 间接访问指针成员name的值
int x,y;
x = 10;
y = x++; // 相当于 y=x; x=x+1; 此时y=10,x=11
x = 10;
y = x--; // 相当于 y=x; x=x--; 此时y=10,x=9
# 一元表达式 9种:
前缀自增++ 前缀自减--
正号运算+ 负号运算- 按位取反~ 逻辑非运算!
类型或数据对象的大小sizeof
例如
int x,y;
x = 10;
y = ++x; // 相当于 x=x+1; y=x 此时y=11,x=11
x = 10;
y = --x; // 相当于 x=x--; y=x 此时y=9,x=9
int i = 10;
int x = +-10; // x=-10,正号运算不改变表达式值正负
int x= -10; // x=-10,负数
x = 10;
y = ~x; // 10转为32位二进制表示 00000000 00000000 00000000 00001010,按位取反变成11111111 11111111 11111111 11110101,y=-11
x = 10;
y = !x; // 0表示假,非0表示逻辑真,x非零为真,取非后为假,y=0
sizeof(int) // 对整型int求长度,一般为4个字节
sizeof(x) // 对变量x求长度,x为int型,值为4个字节
# 强制类型转换:对表达式的值类型进行强制转换
(类型)表达式
(float)3.1415926 // double类型转换为float
(int)3.1415926f // float类型转换为int
(unsigned)100000000 // int类型转换成无符号int
# 二元表达式 8种:
乘除求余表达式:乘法* 除法/ 求余%
注:乘除支持所有整数和小数类型,求余运算只支持整数。除法和求余的除数不能是0。
加减表达式:加法+ 减法-
移位表达式:左移<< 右移>>
注:有符号类型且值为负右移结果,由编译器实现定义处理符号位。
关系表达式:小于< 小于等于<= 大于> 大于等于>=
判等表达式:等于== 不等于!=
按位与表达式:&
两个操作数对应的二进制位置位1时,表达式值对应的位才能为1,否则为0
按位异或表达式:^
两个操作数对应的二进制位取值不同时,表达式值对应的位才能为1,否则为0
按位或表达式:|
两个操作数对应的二进制位有任意1位为0时,表达式值对应的位就能为1,否则为0
int x=2,y=9;
x*y = 18
y/2 = 4 // 整数运算,默认是值是int型,取整
y%x = 1 // 不能整除,余数是1
x+y = 11
x-y = -7
x << 2 // x的值按位向左移动2位,空出的二进制填充0,x = 8
x >> 2 // x按位向右移动2位,空出的二进制填充0,x = 0
x > y // 结果为假,值0
x >= y // 结果为假,值0
x < y // 结果为真,值1
x <= y // 结果为真,值1
x == y // 结果为假,值0
x != y // 结果为真,值1
x & y // x二进制表示 0010,y二进制表示 1001,按位与结果是 0000
x ^ y // 结果1111
x | y // 结果1011
# 逻辑表达式 2种
逻辑与表达式:&&
两个条件都为真时,表达式值才为真,否则为假。
逻辑或表达式:||
两个条件有一个为真时,表达式值就为真,两个条件都为假时,表达式值才为假。
1表示真,0表示假
1 && 0 值 0
1 && 1 值 1
1 || 0 值 1
0 || 0 值0
短路原则:如果第一个条件已经判断最终结果真假,第二个条件不计算。
# 三元表达式 1种
条件运算符 ?:
语法:逻辑或表达式?表达式1:表达式2
当逻辑或表达式结果为真时,返回表达式1的值,否则表达式2的值
int x=1,y=2;
x > y ? x:y // x和y谁大返回谁的值,这里返回y的值
# 赋值表达式 5种
简单赋值:=
复合赋值:
乘除求余复合赋值 *= /= %=
加减复合赋值 += -=
位移复合赋值 左移<<= 右移>>=
位运算复合赋值 与&= 异或^= |=或
x = 1,y=2;
x *= y // x=x*y
x /= y // x=x/y
x %= y // x=x%y
x += y // x=x+y
x -= y // x=x-y
x <<= 2 // x=x<<2
x >>= 2 // x=x>>2
x &= y // x=x&y
x ^= y // x=x^y
x |= y // x=x|y
# 逗号表达式
逗号运算符 ,
多个表达式用逗号分割,从左到右按顺序计算。
逗号表达式运算的结果是最后一个表达式的值。
例如:
x1,y1,x,y // 最后值为y的值
# 常量表达式
- 常量表达式的值在编译时就可以由编译器直接计算得出,不需要程序执行时计算。
- 常量表达式不应包含赋值、增量、减量、函数调用或逗号运算符。
- 特例:sizeof运算符操作数可以出现上述情况,sizeof只需要根据类型推断大小,不需要对操作数求值。
三类:
预处理器常量表达式:预处理指令中使用的整数常量表达式
整数常量表达式:整数常量、枚举常量、字符常量、sizeof表达式、浮点常数强制转换
---------- End ----------
往期精彩推荐:
「喜欢C请赏个 赞 点击右下角 在看」