C语言的操作符的总结以及其表达式的应用:
1、移位操作符:
1)在C语言标准中,只规定了无符号数的移位操作是采用逻辑移位,即左移、右移都是使用的逻辑左移和逻辑右移;
2)使用移位操作符对该操作数本身的值并无影响,因为未有赋值操作符,仅有赋值操作符才可以影响原值;
3)而对于有符号数,其左移操作还是逻辑左移,但右移操作是采用逻辑右移还是算术右移取决于机器;
4)所以一个程序如果使用了有符号数的右移位操作,它就是不可移植(可移植:不同的平台,运行结果相同)的;
5)对于移位运算符,不要移动负数位:a>>-1,未定义。
2、位操作符
规律总结,任何数异或0都是它本身、两个相同的数异或结果为0。
3、赋值操作符
只有赋值才会影响原值。
4、复合赋值符
+=:a = a + (expression);
a += expression;
//两者的区别是:+=只求值一次,效率高于第一种,括号:确保表达式在执行加法运算前已被完整求值。
5、单目操作符
1)++(自增)
a++与++a的区别:++b的结果是b值的copy,并不是变量b本身;
int a = b = 1;
a++;//a = 2;a++的值为1
++b;//b = 2;++b的值为2
2)强转(类型):它是对于类型来讲的,而对于字符串,不能强转,原因是在c语言中,字符串不是类型;
强转对于类型内存空间并未改变,仅是“看做”;
3)sizeof(操作符):以字节为单位,它是操作符,不是函数,所以求字节长度,可以如下写:
int a;
printf("%d\n",sizeof a);//求a变量(类型)所占空间大小
但对于类型不可以这样写: printf("%d",sizeof int);错误 ;
sizeof和数组:
C语言中数组是类型(聚合数据类型);
数组作为函数参数传参时,会发生降维(一维数组就会降为一级指针),所以当在传参过去的函数中sizeof(数组名)的大小为4;
所有的传参都会创建临时变量;
6、逻辑操作符与位操作符
&&、||与&、|
&&(短路与)、||(短路或)是逻辑操作符,用于测试表达式的真假;
&(与)、|(或)是位操作符,用于比较它们的操作数中对应的位。
7、逗号表达式
if(b+1,m*2,a/3),括号中,执行顺序从左到右(全部执行),但整个逗号表达式的值为最后一个表达式的值,即a/3,其余表达式的值被丢弃,无意义。
8、结构体(. ->)
结构体作为函数参数进行传参时不会发生发生降维。
9、左值与右值
左值是表达式,它是在内存中有分配的地址空间的,左值也可以是右值;
右值表示一个值,只能出现在赋值符的右边。
10、复杂表达式的求值的三个因素
操作符的优先级
操作符的结合性
是否控制求值的顺序
优先级仅仅决定相邻两个操作符的先后执行顺序,eg:a * b + c * d + e * f;该表达式只用保证每个乘法运算在它相邻的加法之前执行就可以。
11、c语言操作符优先级
"单 算 移 关 位 逻 条 赋 逗"
优先级 | 运算符 | 名称或含义 | 使用形式 | 结合方向 | 说明 |
1 | [] | 数组下标 | 数组名[常量表达式] | 左到右 | |
() | 圆括号 | (表达式)/函数名(形参表) | |||
. | 成员选择(对象) | 对象.成员名 | |||
-> | 成员选择(指针) | 对象指针->成员名 | |||
2(单目) | - | 负号运算符 | -常量 | 右到左 | 单目运算符 |
(类型) | 强制类型转换 | (数据类型)表达式 | |||
++ | 自增运算符 | ++变量名/变量名++ | 单目运算符 | ||
-- | 自减运算符 | --变量名/变量名-- | 单目运算符 | ||
* | 取值运算符 | *指针变量 | 单目运算符 | ||
& | 取地址运算符 | &变量名 | 单目运算符 | ||
! | 逻辑非运算符 | !表达式 | 单目运算符 | ||
~ | 按位取反运算符 | ~表达式 | 单目运算符 | ||
sizeof | 长度运算符 | sizeof(表达式) | |||
3(算术) | / | 除 | 表达式/表达式 | 左到右 | 双目运算符 |
* | 乘 | 表达式*表达式 | 双目运算符 | ||
% | 余数(取模) | 整型表达式/整型表达式 | 双目运算符 | ||
| + | 加 | 表达式+表达式 | 左到右 | 双目运算符 |
- | 减 | 表达式-表达式 | 双目运算符 | ||
4(移位) | << | 左移 | 变量<<表达式 | 左到右 | 双目运算符 |
>> | 右移 | 变量>>表达式 | 双目运算符 | ||
5(关系) | > | 大于 | 表达式>表达式 | 左到右 | 双目运算符 |
>= | 大于等于 | 表达式>=表达式 | 双目运算符 | ||
< | 小于 | 表达式<表达式 | 双目运算符 | ||
<= | 小于等于 | 表达式<=表达式 | 双目运算符 | ||
| == | 等于 | 表达式==表达式 | 左到右 | 双目运算符 |
!= | 不等于 | 表达式!= 表达式 | 双目运算符 | ||
6(位) | & | 按位与 | 表达式&表达式 | 左到右 | 双目运算符 |
| ^ | 按位异或 | 表达式^表达式 | 左到右 | 双目运算符 |
| | | 按位或 | 表达式|表达式 | 左到右 | 双目运算符 |
7(逻辑) | && | 逻辑与 | 表达式&&表达式 | 左到右 | 双目运算符 |
| || | 逻辑或 | 表达式||表达式 | 左到右 | 双目运算符 |
8(条件) | ?: | 条件运算符 | 表达式1? 表达式2: 表达式3 | 右到左 | 三目运算符 |
9(赋值) | = | 赋值运算符 | 变量=表达式 | 右到左 | |
/= | 除后赋值 | 变量/=表达式 | |||
*= | 乘后赋值 | 变量*=表达式 | |||
%= | 取模后赋值 | 变量%=表达式 | |||
+= | 加后赋值 | 变量+=表达式 | |||
-= | 减后赋值 | 变量-=表达式 | |||
<<= | 左移后赋值 | 变量<<=表达式 | |||
>>= | 右移后赋值 | 变量>>=表达式 | |||
&= | 按位与后赋值 | 变量&=表达式 | |||
^= | 按位异或后赋值 | 变量^=表达式 | |||
|= | 按位或后赋值 | 变量|=表达式 | |||
10(逗号) | , | 逗号运算符 | 表达式,表达式,… | 左到右 | 从左向右顺序运算 |