四、运算符、表达式和语句
- 算术运算符(+ 、 - 、 *、 /、 %、 ++ 、 --)
- 加法运算符:+ ----------a+b
- 减法运算符:- ----------a-b
- 乘法运算符:* ----------a*b
- 除法运算符:/ ----------a/b
- 求余运算符:% ---------a%b
例:a = 3,b= 2, a%b = 1 。 规定求余的两个操作数必须为整数。(常识) - 自增运算符:++ 理解为:a++等同于a +1,但是在某一表达式中,则计算规则不同。
例如:
1.a++举例
a = 3; c = 0;d = 0;
c = a++;//运算完此语句后c = 3;
d = a; //运算完此语句后d = 4;
由上面结果可以看出 a++语句在运行时,是先将a的值赋值给c而后进行a+1;
2.++a举例
a = 3; c = 0;d = 0;
c = ++a;//运算完此语句后c = 4;
d = a; //运算完此语句后d = 4;
由上面结果可以看出 ++a语句在运行时,是先运行a+1而后将结果值赋值给c;
- 自减运算符:- - 理解为:a- -等同于a -1,但是在某一表达式中,则计算规则不同。具体规则同a++。
面试题1:已知以下信息,求执行结果
int j = 10;
printf(“%d%d%d%d%d%d”, j, ++j, j++, j, ++j, j--);
结果为: 12 12 10 12 12 10
分析:
第一点:printf()的运算规则是从右往左执行的,涉及内容(栈空间的存储方式:先进后出,后进先出),因此printf()执行顺序为 :j-- => j++ => j => j++ => ++j => j。
第二点:对于优先级来说,后置++享有最高优先级,因此在运行的过程中,如果碰到后置++(- -),分析结果是多少则输出多少,碰到前置++(- -)或者不加不减(j)时,程序正常运算但是不输出结果,待整个表达式运算完毕后将最终值赋给含前置++(- -)或不加不减(j)进行输出。
如图示
j-- -> j = 10 输出 后j = j-1 = 9
++j -> j = j+1 = 10 不输出 后j = 10
j -> j = 10 不输出 后j = 10
j++ -> j = 10 输出 后j= j+1 = 11
++j -> j = j+1=12 不输出 后j =12
j -> j = 12 不输出 后j = 12
表达式执行完毕 最终 j = 12
上面所有不输出的结果 全部均输出 12 得到结果 12 12 10 12 12 10
- 关系运算符 (>= 、 <= 、 == 、 != 、 > 、 <)
- 大于等于: >= ----------a>=3
- 小于等于 :<= ----------a<=3
- 不等于: != ------------a!=3
- 等于: == ----------------a==3
- 大于 : > ---------------------a>3
- 小于: < ----------------------a<3
- 逻辑运算符(&& 、||、 !)
-
逻辑与 : &&
(表达式1) && (表达式2)
只有表达式1和表达式2 都为真,整个式子的值才为真,如果表达式1的值为假,表达式2不再计算 -
逻辑或 :||
(表达式1) || (表达式2)
只要有一个表达式的值为真,整个式子的值就为真;两个式子都为假,整个式子才为假,如果表达式1的值为真,表达式2不再计算 -
逻辑非 :!
!(表达式)
如果表达式为真,结果为假;如果表达式为假,结果为真
- 位运算符
-
按位与 & : 按位进行与运算,两个1为1,有0则0。
0101 & 0011 结果为 0001 -
按位或 | :按位进行或运算,两个0为0,有1则1。
0101 | 0011 结果为 0111 -
按位取反 ! :按位取反,遇1变0,遇0变1.
! (0101) 结果为 1010 -
按位左移 << :
1.有符号数:符号位不变,左边移出的位舍弃,右边空出的位补0
_______ 0 111010 <<3 结果为 0 010000
_______ 1 001011 <<3 结果为 1 0110002.无符号数:左边移出的位舍弃,右边空出的位补0,且左移n位,相当于乘2的n次方
_______0001 0110 <<2 结果为 0101 1000 等价于
_______十进制数 22( 0001 0111 ) * 2 ^ 2 = 88 (0101 1000 )
-
按位右移 >> :
1.有符号数:符号位不变,右边移出的位舍弃,左边空出的位补符号位
_______ 0 111010 >>3 结果为 0 000111
_______ 1 001011 >>3 结果为 1 1110012.无符号数:右边移出的位舍弃,左边空出的位补0,且右移n位,相当于除2的n次方
_______0001 0110 >>2 结果为 0000 0101 等价于
_______十进制数 22( 0001 0111 ) */2 ^ 2 = 5 (0000 0101 ) 原本为5.5,但是换算二进制会直接取整数部分
- 其他运算符(简便格式)
- 赋值 = : a = 1;---------------将1赋值给a
- 加等 += : a += 1; -----------a = a+1;
- 减等 -= : a -= 1; -------------a = a-1;
- 乘等 *= : a * =2; -------------a = a * 2;
- 除等 /= : a / = 2; -------------a = a / 2;
- 求余缩写 %= : a %= 2; -------------a = a %2;
- 逗号 , : (a=3 , a= 4, a = 5);-------- 从左往右运算 最终a = 5
五、控制流
下章分析
以上内容纯属个人观点,如有错误,欢迎纠正。