[英]What will the following code evaluate?
我在测试中有以下代码。我对(i,j)的计算结果感到困惑,在阅读有关“,”运算符时,我发现它只是对变量或函数求值,但是它在这里做什么呢?
main()
{
int i = 10, j = 20;
j = i ? (i, j) ? i : j : j;
printf("%d %d", i, j);
}
(i,j)
是完全相同只是j
,因为i
仅仅是一个变量,计算它不会引起任何副作用。
因此,基本上,这里只是混淆。
在(i,j)
中,
运算符不执行任何操作,因为左侧表达式没有副作用。
因此,该分配等同于:
j = i? (j? i : j) : j;
并且由于i
和j
非零,所以j = i;
逗号运算符可用于将相关表达式链接在一起。 从左到右评估逗号连接的表达式列表, 最右边的表达式的值是组合表达式的值。 它充当序列点 。
序列点保证了先前评估的所有副作用都将被执行,并且后续评估尚未产生任何副作用。
因此,任何表达式/赋值都将完成,然后才评估右边的下一个表达式。
例如,
b=(a=4,a=5);
给,
a=5
b=5
另外,请注意,逗号运算符在C中的运算符优先级列表中排名最后。
它将打印:
10 10
这是因为您可以将表达式分解为:
j =我? ((i,j)?i:j):j;
逗号运算符计算得出最后一个表达式-so(i,j)== j。 该值非零,因此中心表达式的计算结果为i。 “ i”为非零值,外部表达式的计算结果为i,因此将j赋给i的值。
这等效于:
int main() {
int i = 10, j = 20;
if (i != 0) {
(void)i; // Do nothing with i.
if (j != 0) {
j = i;
} else {
j = j; // Assign j to itself.
}
} else {
j = j; // Assign j to itself.
}
printf("%d %d", j);
}
看起来像典型的软件笔试题。 它用于混淆候选人。 正如上面的sepp2k所建议的,它与j相同。 还有一个面试问题
i = 10; j = 20;
1) k = i,j;
2) k = (i,j);
1的答案将是10,而2的答案将是20。由于昏迷,操作员什么也不做。 我希望这会清除更多。
它实际上并没有做任何事情。 它计算表达式i
,舍弃结果,计算表达式j
并返回结果。
因为评估表达式i
没有副作用,所以(i,j)
的含义与j
相同。
main()
{
int i = 10, j = 20; // i=10, j=20
j = i ? /*if i */ ( (i, j) ? /* if j (1) */ i : /* else */ j ) : /* else */ j; // Added parenthesis and see (2)
printf("%d %d", i, j); // Will therefore print 10 10
}
if(j)
等价,因为(i,j)
评估为j
因为i
没有副作用。 i
都评估为true,因为i
和j
为整数且非零
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.