gcc编译器上的foll基本代码输出3。
但是当我替换{}
它时()
它输出 4
int i={3,2,4};printf("%d",i);
有人可以解释这种行为吗?运算符遵循从左到右的,
评估,但在{}
.
gcc编译器上的foll基本代码输出3。
但是当我替换{}
它时()
它输出 4
int i={3,2,4};printf("%d",i);
有人可以解释这种行为吗?运算符遵循从左到右的,
评估,但在{}
.
当您使用 {3,2,4} 时,您使用的是标量初始化,但您提供的元素比您应该提供的更多。这将触发编译器的警告,但是它会编译和执行,并且标量初始化的第一个元素将归因于变量 i。
当您使用 (3,2,4) 时,您基本上是在使用逗号运算符(需要括号,因为您正在初始化变量)。逗号运算符计算第一个操作数并丢弃结果,然后计算第二个操作数并返回结果。所以这里你计算 3,丢弃它,然后计算 2,返回它(这个返回值用作第二个逗号的左操作数),最后计算 4,并返回它,所以 4 归于变量 i。
这是另一个有趣的操作:
int i;
i = 3,4;
printf("%d\n",i);
这将打印 3,因为首先 i=3 将被计算(因为这是逗号的左操作数),其结果将被丢弃。然后 4 将被评估并返回其结果,但不归因于变量。
为了让事情变得更有趣:
int i,j;
j = (i = 3,4);
printf("%d %d\n",i,j);
这将打印“3 4”。换句话说,我上面描述的一切都会发生,但是当 4 被评估并返回时,它现在将归因于 j。