1.运算符
用于进行某种运算的符号
通过涉及到的数目分为单目运算符(i++),双目运算符(+ - * / % …),三目运算符( (判断)? A:B)
在C语言中a+b 是不等价与 b+a 的,ru:(i++)+ (i+j) 与 (i+j)+ (i++)
C语言运算优先级,单目运算符 > 算术运算符 > 关系运算符 > 逻辑运算符 > 条件运算符 > 赋值运算符 > 逗号运算符
1)算术运算符
进行算术运算的符号,
++ -- :单目运算符
注意(++i)与(i++)是不同的。i++先输出后运算,++i先运算后输出
int i=1;
printf("%d",i++); // 1 printf("%d",++i); // 2
执行完此语句后i的值都是2;
+ - * / % 双目运算符
/ 得到的结果为商,如3/2 得到的结果为 1 . 5/2的结果为2
% 得到的结果为余数 如6%4 得到的结果为 2
当涉及到两个不同类型的数据,如 double 和 int ,需要向精准度高的转换。
2)关系运算符
用来判断两个数的大小关系
< > >= <= ==(等于) !=(不等于)
关系成立结果为1,不成立结果为0
值得注意的是5>4>3 这种写法结果为0,步骤为,5>4结果为1,然后1>3结果为0
3)逻辑运算符
!逻辑非 单目运算符 “取反”
&& 逻辑与 || 逻辑或 双目运算符 具有(惰性运算!)
逻辑真:(非0或者1)
逻辑假:0
4)位运算符
按照bit位进行运算
& 按位与 都是1则为1
| 按位或 有1就为1
^ 按位异或 不同为1,相同为0
~ 按位取反 1变成0,0变成1
<<按位左移 >>按位右移
左移 右边补0,舍弃超出的高字节
右移 丢弃右边的低字节,高字节,有符号补符号位,无符号(定义为unsigned)补0
两个数交换,不涉及到第三个元素:
{
int a=3,b=4;
a=a^b;
b=a^b;
a=a^b;
}
5)赋值运算符:
= 双目运算符,优先级只比逗号运算符高
赋值运算符要求左边的操作数必须有左值(可写的地址)
5=5 ERROR
2+3 = 5 ERROR
i++ = 5 ERROR 左边不能为表达式
a += 5 += 6 ; ERROR
6)条件运算符
expression ? a :b
如果表达式expression值为真,整个表达式的值就是a的值
如果表达式expression值为假,整个表达式的值就是b的值
7)逗号运算符
优先级最低,结合性从左至右 ,最后的值为最后一个的值
a = (a = 6,b = 5); //a = =5
求值顺序:
先求表达式1的值,再表达式2的值 。。。。。最后
求表达式n的值。
整个逗号表达式的值就是表达式n的值。
8) 指针表达式
&取地址 *取值
9)求字节运算符 sizeof
单目运算符 ,求一个对象或类型所占空间字节数。
sizeof(x) 求x的类型,不要求x存在,但是要求x的类型是确定的
10) 分量运算符:
求结构体中成员变量(分量)
.
->
11) 下标运算符
[]
int a[10]; a[0] a[1]
12) 强制转换运算符
(类型)
eg:
(unsigned char )255
13) 其他
2.表达式
什么是表达式?
表达某个意思的式子
在C语言,表达式一般是指用运算符连接起来的式子
表达式一定会有一个值,这个值就是上面的表达式的"某个意思"
a = 5
a = 5, n = 6