我在测试中有以下代码。我对(i,j)的评估感到困惑,在阅读“,”运算符时,我发现它只是评估变量或函数,但它在这里做了什么? / p>
main()
{
int i = 10, j = 20;
j = i ? (i, j) ? i : j : j;
printf("%d %d", i, j);
}
答案 0 :(得分:4)
(i,j)
与j
完全相同,因为i
只是一个变量并且评估它不会导致任何副作用。
所以基本上这只是混淆。
答案 1 :(得分:3)
(i,j)
中,,
运算符不执行任何操作,因为左侧表达式没有副作用。
因此赋值相当于:
j = i? (j? i : j) : j;
由于i
和j
不为零,因此j = i;
答案 2 :(得分:2)
逗号运算符可用于将相关表达式链接在一起。以逗号链接的表达式列表是从左到右,最右侧表达式的值是组合表达式的值。它充当序列点。
序列点保证先前评估的所有副作用都已执行,并且尚未执行后续评估的副作用。
因此,任何表达/作业都将完成&只有这样才能评估右边的下一个表达式。
例如,
b=(a=4,a=5);
给出,
a=5
b=5
另请注意,逗号运算符在C中的运算符优先级列表中排在最后。
答案 3 :(得分:1)
它将打印:
10 10
这是因为您可以将表达式分解为:
j =我? ((i,j)?i:j):j;
逗号运算符求值到最后一个表达式 - so(i,j)== j。这不是零,因此中心表达式的计算结果为i。 'i'非零,外部表达式求值为i,因此j被赋值为i的值。
答案 4 :(得分:1)
这相当于:
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);
}
答案 5 :(得分:1)
看起来像典型的软件编写测试问题。它被用来混淆候选人。如上面的sepp2k所示,它与j相同。还有一个面试问题
i = 10; j = 20;
1) k = i,j;
2) k = (i,j);
1的答案是10,2的答案是20.因为昏迷操作员什么都不做。我希望这会更清楚。
答案 6 :(得分:0)
它并没有真正做任何事情。它正在评估表达式i
,丢弃结果,计算表达式j
并返回结果。
由于评估表达式i
没有副作用,(i,j)
与j
具有相同的含义。
答案 7 :(得分:0)
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
和j
是整数且非零