就像你写 a = 1+2 一样,“1+2”也是个表达式
“==”跟“+”一样都是运算符,“a == b”也是个表达式,它的类型是“布尔型或逻辑型(C语言中只有整形,但概念上可以看作布尔型)”,当 Adjust_Index 值为6,该表达式值就是1,当不是6,该表达式的值就是1
“变量 = 表达式”再正常不过了,当然 ?: 不能算错
唯一问题就是大家都有个思维定式,习惯于认为 a==b 这样的东西只能放在 if() 的怀抱里
MISRA 强调的是安全性,很重要的一条就是表达式的副作用,如果 Adjust_Index 是个有副作用的表达式,比如,是个函数 f(),返回一个整数,但内部干了很多其它事,比方说修改全局变量、向硬件发送指令……,那把它嵌在一个复杂表达式内部就有潜在的危险了,这时,稳妥的做法是先把它的返回值赋给某个变量,再用这个变量
a = f();
b = ...
……
if( a && b )
...
这时,这个 a && b 的表达式是非常安全的,当然 MISRA 的做法更极端,它要求写成
if(a)
if(b)
...
所有这些跟 Adjust_Index == 6 这样的写法都没有冲突,只要 Adjust_Index 是个单纯的变量
当然,每个公司都有自己风格,工作中,团队精神第一
我见过的多数风格都是靠断言辅助调试、保证正确性
有时候,最“笨”的反而是最好的,所以用 if else 的那种写法也不错,不优美,但实用
问号表达式那种,既不优美,也不实用 |