操作符和表达式
1. 算数操作符
加“+”:把两个操作数相加。
减“-”:从第一个操作数中减去第二个操作数。
乘“*”:把两个操作数相乘。
除“/”:两个操作数相除。
取模(求余)“%”:整除后取余数。
注意:
①%不能对浮点数进行取模,只能对整数。而其他的均可以对浮点数进行操作。
②/操作分为整数除法和浮点数除法。
2. 移位操作符
左移操作符<<:表示二进制序列向左移动规定位数,最高位丢弃,最低位补0。
右移操作符>>:表示二进制序列向右移动规定位数,分为算术右移和逻辑右移。
算数右移:右边丢弃,左边补符号位。
逻辑右移:右边丢弃,左边补0。
注意:
警告:①左移操作相当于给操作数乘2。
②右移操作(不论是算数还是逻辑)相当于给操作数除2。
①对于移位运算符,不要移动负数位,这个是标准未定义的。
3. 位操作符
按位与“&”:二进制序列按位与操作,同时为1才为1。
按位或“|”:二进制序列按位或操作,同时为0才为0。
按位异或“^”:二进制序列按位异或操作,相同为0,相异为1。
可以实现不创建第三个变量就实现两个数的交换。
注意:
①位操作符的操作数必须为整数。
4. 赋值操作符
基本的赋值运算符是“=”注意:
①int a=1;初始化
A=2;赋值这两个“=”代表的意思不一样。
复合赋值符:
加且赋值“+=”: C+=A相当于C=C+A。
减且赋值“-=”: C-=A相当于C=C-A。
乘且赋值“*=”: C*=A相当于C=C*A。
除且赋值“/=”: C/=A相当于C=C/A。
求模且赋值“%/”: C%=A相当于C=C%A。
左移且赋值“<<=”: C<<=1相当于C=C<<1。
右移且赋值“>>=”: C>>=1相当于C=C>>1。
按位与且赋值“&=”: C&=1相当于C=C&1。
按位异或且赋值“^=”: C^=A相当于C=C^1。
按位或且赋值“|=”: C|=A相当于C=C|1。
5. 单目操作符
逻辑反操作“!”:逻辑反操作,用来逆转操作数逻辑状态。
Int flag=1; !flag=0;
负值“-”:表示一个数为负值。
正值“+”:表示一个数为正值。
取地址“&”:返回变量的地址。
printf(“%p ”,&a);打印a的地址。
printf(“%p “,&arr);打印数组arr的地址。
printf(“%p “,arr);打印数组arr的首元素地址。
printf(“%p “,&arr+1);打印数组arr加了40后的地址。
printf(“%p “,arr+1);打印数组arr加了4的地址。
操作数的类型长度“sizeof”:求取操作数的类型长度。以字节为单位。
注意:
①sizeof(a) 和 sizeof a均可以执行,证明sizeof不是函数。
②数组名单独放在sizeof内部,数组名表示整个数组。
③sizeof内部的表达式不计算。
④sizeof(类型)一定要加括号,不可省略。
对一个数的二进制按位取反“~”:
注意:
①符号位也要取反。
前置、后置减减“--”:自减运算符。
注意:
①前置--:先--,再使用。
②后置--:先使用,再--。
前置、后置加加“++”:自增运算符。
注意:
①前置++:先++,再使用。
②后置++:先使用,再++。
补充:
①指针++:
prinft(“%p ”,p);0x0012ff40
printf(“%p ”,++p);0x0012ff44 相当于加上了1*sizeof(指针类型)的值
直接访问(解引用)操作符“*”:
注意:
①int * p=&a; *是定义指针类型时的规定,不是解引用操作符。
*p=20; *为解引用操作符。
强制类型转换“(类型)”:当操作数的类型不同,而且不属于基本数据类型时,经常需要将操作数转化为所需要的类型。
6. 关系操作符
大于“>”:a大于b时返回真;否则返回假。
小于“<”:a小于b时返回真;否则返回假。
大于等于“>=”:a大于等于b时返回真;否则返回假。
小于等于“<=”:a小于等于b时返回真;否则返回假。
不等于“!=”:a不等于b时返回真;否则返回假。
等于“==”:a等于b时返回真;否则返回假。
注意:
①不要将==和=的作用混为一谈。
②关系运算符的值只能是0或1。
③关系运算符的值为真时,结果值都为1。
④关系运算符的值为假时,结果值都为0。
7. 逻辑操作符
逻辑与“&&”:只有两个操作数都是true,结果才是true。但是如果左边操作数为false,就不计算右边的表达式,直接得出false(左边为假后边不用算)。
逻辑或“||”:如果一个操作数或多个操作数为 true,则逻辑或运算符返回布尔值 true;只有全部操作数为false,结果才是 false。仅当第一个操作数的计算结果为 false 时计算第二个操作数(左边为真后面不用算)。
8. 条件操作符(三目操作符)
<表达式1> ? <表达式2> : <表达式3>;
"?"运算符的含义是:先求表达式1的值,如果为真,则执行表达式2,并返回表达式2的结果;如果表达式1的值为假,则执行表达式3,并返回表达式3的结果。
9. 逗号表达式
逗号表达式“,”:它将两个及其以上的式子联接起来,从左往右逐个计算表达式,整个表达式的值为最后一个表达式的值。
注意:
①逗号表达式的运算过程为:从左往右逐个计算表达式。
②逗号表达式作为一个整体,它的值为最后一个表达式(也即表达式n)的值。
③逗号运算符的优先级别在所有运算符中最低。
10. 下标引用
“[]”:操作数:一个数组名+一个索引值。
11. 函数调用
“()”:一般形式为:函数名(实际参数表)。
注意:
①对无参函数调用时则无实际参数表。实际参数表中的参数可以是常数、变量或其它构造类型数据及表达式。各实参之间用逗号分隔。
②字符函数引用即对引用有关库函数或自定义函数函数。
12. 结构成员
. 结构体.成员名
-> 结构体指针->成员名
附:
运算符优先级
优先级 运算符 名称或含义 使用形式 结合方向 说明 1后置++ 后置自增运算符 变量名++ 左到右后置-- 后置自减运算符 变量名-- [ ]数组下标 数组名[整型表达式] ( ) 圆括号 (表达式)/函数名(形参表) . 成员选择(对象) 对象.成员名 -> 成员选择(指针) 对象指针->成员名 2 - 负号运算符 -表达式 右到左 单目运算符 (类型) 强制类型转换 (数据类型)表达式 前置++ 前置自增运算符 ++变量名 单目运算符 前置-- 前置自减运算符 --变量名 单目运算符 * 取值运算符 *指针表达式 单目运算符 & 取地址运算符 &左值表达式 单目运算符 ! 逻辑非运算符 !表达式 单目运算符 ~ 按位取反运算符 ~表达式 单目运算符 sizeof 长度运算符 sizeof 表达式/sizeof(类型) 3 * 乘 表达式*表达式 左到右 双目运算符 / 除 表达式/表达式 双目运算符 % 余数(取模) 整型表达式%整型表达式 双目运算符 4 + 加 表达式+表达式 左到右 双目运算符 - 减 表达式-表达式 双目运算符 5 << 左移 表达式<<表达式 左到右 双目运算符 >> 右移 表达式>>表达式 双目运算符 6 > 大于 表达式>表达式 左到右 双目运算符 >= 大于等于 表达式>=表达式 双目运算符 < 小于 表达式<表达式 双目运算符 <= 小于等于 表达式<=表达式 双目运算符 7 == 等于 表达式==表达式 左到右 双目运算符 != 不等于 表达式!= 表达式 双目运算符 8 & 按位与 整型表达式&整型表达式 左到右 双目运算符 9 ^ 按位异或 整型表达式^整型表达式 左到右 双目运算符 10 | 按位或 整型表达式|整型表达式 左到右 双目运算符 11 && 逻辑与 表达式&&表达式 左到右 双目运算符 12 || 逻辑或 表达式||表达式 左到右 双目运算符 13 ?: 条件运算符 表达式1? 表达式2: 表达式3 右到左 三目运算符 14 = 赋值运算符 变量=表达式 右到左 /= 除后赋值 变量/=表达式 *= 乘后赋值 变量*=表达式 %= 取模后赋值 变量%=表达式 += 加后赋值 变量+=表达式 -= 减后赋值 变量-=表达式 <<= 左移后赋值 变量<<=表达式 >>= 右移后赋值 变量>>=表达式 &= 按位与后赋值 变量&=表达式 ^= 按位异或后赋值 变量^=表达式 |= 按位或后赋值 变量|=表达式 15 , 逗号运算符 表达式,表达式,… 左到右 从左向右顺序运算