我在接受C编程的采访时遇到了这个问题。那是:
int X,i=4,j=7;
X=j || i++ && 1;
X
和i
的价值是多少?
我在编译器上测试了程序,输出是:
X=1 , i =4
你能解释一下原因吗?
答案 0 :(得分:6)
这是测试您对运算符优先级(或语言语法,如果您愿意)的了解,并且您知道运算符优先级和评估顺序之间的区别。
该协会是:
X = (j || (i++ && 1));
请注意,优先级通常不等于执行顺序。在这种情况下,我们有以下评估逻辑:
=
,我们需要评估其右侧操作数(j || stuff...)
,我们首先评估j
j
不为零,因此(j || stuff...)
的结果为1
,由于{{1}的短路行为,我们不评估stuff
}} ||
的右侧操作数已评估为=
,因此请将1
分配给1
。最终结果:X
,X == 1
和i
不变。
答案 1 :(得分:5)
这里只检查j的值是否为真。 如果j为真,则将值1(真)分配给x,然后程序退出
注意i ++未执行,
这也被称为C编程中的短路
int X,i=4,j=7;
X=j || i++ && 1;
x = j != 0 // is what is executed
如果j为0,则执行(i ++&& 1)
答案 2 :(得分:1)
它读起来像这样:
X = (j != 0 || (i++ != 0 && 1 != 0))
在这种情况下,j是" true" (!= 0),因此表达式j!= 0的布尔结果被赋值给X. 无需验证比较器的右手(i ++!= 0&& 1!= 0),因为左侧已经评估为真。
i ++永远不会被执行所以我保留其原始值