任务操作混乱

时间:2011-03-21 05:59:08

标签: c++ c declaration variable-assignment

以下代码的输出是什么:

int main() {
  int k = (k = 2) + (k = 3) + (k = 5);
  printf("%d", k);
}

它没有任何错误,为什么?我认为它应该给出错误,因为赋值操作与k的定义在同一行。

我的意思是int i = i;无法编译。 但它编译。为什么?什么是输出,为什么?

3 个答案:

答案 0 :(得分:7)

int i = i编译,因为3.3.1 / 1(C ++ 03)说

  

名称的声明点紧跟在其完整的声明符之后和初始值之前

所以i初始化时有自己的不确定值。

然而,代码调用未定义的行为,因为k在两个序列点之间被多次修改。请阅读Undefined Behaviour and Sequence Points

上的此常见问题解答

答案 1 :(得分:0)

int i = i;首先定义变量,然后为其赋值。在C中,您可以从未初始化的变量中读取。这绝不是一个好主意,有些编译器会发出警告信息,但这是可能的。

在C中,作业也是表达式。输出将是“10”,或者如果你有一个'k',而不是'a'。

答案 2 :(得分:0)

哇,我也有11岁。我认为k被分配到3次,然后一次到5次加入。只有int k = (k=2)+(k=3)得到6,而int k = (k=2)+(k=4)得到8,而int k = (k=2)+(k=4)+(k=5)给出13. int k = (k=2)+(k=4)+(k=5)+(k=6)给出19(4 + 4 + 5 + 6)。

我猜?添加从左到右完成。添加前两个(k = x)表达式,结果存储在寄存器或堆栈中。但是,由于此表达式为k + k,因此添加的两个值都是当前的k,这是第二个表达式,因为它是在另一个之后计算的(将其赋值覆盖到k)。但是,在此初始添加之后,结果存储在其他位置,因此现在可以安全地防止篡改(更改k不会影响它)。从左向右移动,每次连续添加都会重新分配k(不影响运行总和),并将k添加到运行总和中。