繁体   English   中英

以下代码将评估什么?

[英]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;

并且由于ij非零,所以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
}
  1. 它与if(j)等价,因为(i,j)评估为j因为i没有副作用。
  2. 所有i都评估为true,因为ij为整数且非零

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM