以下代码将评估什么?

时间:2010-09-20 11:37:17

标签: c

我在测试中有以下代码。我对(i,j)的评估感到困惑,在阅读“,”运算符时,我发现它只是评估变量或函数,但它在这里做了什么? / p>

main()
{
    int i = 10, j = 20;

    j = i ? (i, j) ? i : j : j;
    printf("%d %d", i, j);
}

8 个答案:

答案 0 :(得分:4)

(i,j)j完全相同,因为i只是一个变量并且评估它不会导致任何副作用。

所以基本上这只是混淆。

答案 1 :(得分:3)

(i,j)

,运算符不执行任何操作,因为左侧表达式没有副作用。

因此赋值相当于:

j = i? (j? i : j) : j;

由于ij不为零,因此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
}
  1. if(j)等效,因为(i,j)评估为j因为i没有副作用。
  2. 所有ifs评估为true,因为ij是整数且非零