繁体   English   中英

任务操作混乱

[英]assignment operation confusion

以下代码的输出是什么:

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

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

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

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

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

所以i用它自己的不确定值初始化。

但是,代码调用未定义的行为,因为k在两个序列点之间被多次修改。 阅读有关未定义行为和序列点的此常见问题解答

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

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

哇,我也有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加到运行总和上。

暂无
暂无

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

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