程序员的武器:键盘
首先,来看一道题
1.若有定义:int b=7; float a=2.5,c=4.7;
则以下表达式的值为: ______
a+(int)(b/3*(int)(a+c)/2)%4
2.
result = 2;
result = ( result = result * 2 ) * 6 * ( result = 3 + result );
请问result的值再计算后是多少?
第一题的答案是5.5,第二题的答案是168。
设想一个情景,你写的程序有如上的代码,然后交给你的同事…………
同事读到这一行的时候,反手抄起手边IQUNIX全铝外壳的键盘向你的头砸来…………
玩笑话到此结束,这两道题虽然有严重的可读性差的问题,但是……作为一个刚学c语言的菜鸟,这样的训练一方面可以让我们记住表达式的逻辑和顺序,同时也可以让我们从此养成诅咒出题老师的好习惯(bushi)。
算符列表
以下是来自菜鸟教程的运算符优先级列表
类别 | 运算符 | 结合性 |
---|---|---|
后缀 | `() [] -> . ++ --` | 从左到右 |
一元 | `+ - ! ~ ++ -- (type)* & sizeof ` | 从右到左 |
乘除 | `* / % ` | 从左到右 |
加减 | `+ - ` | 从左到右 |
移位 | `<< >> ` | 从左到右 |
关系 | `< <= > >= ` | 从左到右 |
相等 | `== != ` | 从左到右 |
位与 AND | `& ` | 从左到右 |
位异或 XOR | ^ | 从左到右 |
位或 OR | `| ` | 从左到右 |
逻辑与 AND | `&&` | 从左到右 |
逻辑或 OR | `|| ` | 从左到右 |
条件 | `?: ` | 从右到左 |
赋值 | `= += -= *= /= %=>>= <<= &= ^= |= ` | 从右到左 |
逗号 | `, ` | 从左到右 |
其中每个运算符的作用不再赘述。以上的运算符中主要用到的大体分为三类:
- 算术运算符
- 关系运算符
- 逻辑运算符
这三者的优先级为算术运算符>关系运算符>逻辑运算符。
剩下的为
- 位运算符
- 赋值运算符
- 杂项运算符
所谓的实战
已知:b=2, c=3, d=4, e=5, f=2
求执行以下表达式后,a
的值
a = b+= c++-d+--e/-f
逐步分析:
- 将其中所有运算按类型分好并排序
后缀 ++
一元 - --
乘除 /
加减 +
赋值 =
- 逐一计算
c++
c的值在执行完此语句后变为4-f
值为-2,-d
的值为-4,--e
为4--e/-f
为-2- 最右端的=后,所有的加减运算结果为-1
- a=b,a=-1
答案是-1。
一斤鸭梨!
但是,此语句中存在一个极易引起歧义的点c++
。引用一段来自C Primer Plus的话:
还有一种情况,也不确定:
n = 3;
y = n++ + n++;
可以肯定的是,执行完这两条语句后,n的值会比旧值大2。但是,y的值不确定。在对y求值时,编译器可以使用n的旧值(3)两次,然后把n递增 1两次,这使得y的值为6,n的值为5。或者,编译器使用n的旧值(3)一次,立即递增n,再对表达式中的第2个n使用递增后的新值,然后再递增n, 这使得 y 的值为 7,n 的值为 5。两种方案都可行。对于这种情况更精确地说,结果是未定义的,这意味着 C标准并未定义结果应该是什么。
所以,即便你已经完全掌握了c语言的运算符运算法则,也不建议你在实际操作中使用这种奇葩的一连串的用法,即便这对c是合法的。除非,你在办公室里也不摘下电动车的头盔。
感谢阅读~也欢迎各位来我的博客玩耍~
链接:Aldehyde's blog
昨天刚刚搭建好的,比较粗糙…………orz
感谢各位的支持!