序列点和副作用

时间:2015-06-29 04:55:48

标签: c post-increment sequence-points

根据序列点定义,序列点是执行序列中称为序列点的<#34; 指定点,以前的评估的所有副作用都保证完整&#34;

因此,在下面的程序中,++运算符的所有副作用必须在转到&&运算符的第二部分之前执行,即i应该增加到1作为{ {1}}是序列点。

&&

预期产出:

  

1(#include<stdio.h> int main() { int i=0,a; a=i++&&1; printf("%d",a); getchar(); return 0; }

实际输出:

  

0

为什么在第二部分之前没有1&&1=1增加?

使用三元运算符也可以提供相同的输出:

i

三元运算符也是序列点。所以不应该给出输出1而不是0?

1 个答案:

答案 0 :(得分:5)

i++

评估以前的i值。

由于i的副作用值增加1

是的,序列点在那里,但表达式i++评估为0(尽管i的值同时为1

预期结果use ++i instead of i++

来自C11规范中的 6.5.2.4后缀增量和减量运算符

  

postfix ++运算符的结果是操作数的值。如   副作用,操作数对象的值递增(即   是,相应类型的值1被添加到它)。见   关于加法算子和复合赋值的讨论   有关约束,类型和转换以及影响的信息   对指针的操作。结果的值计算是   在更新存储值的副作用之前排序   操作数。关于不确定顺序的函数调用,   postfix ++的操作是单一的评估。 Postfix ++上   具有原子类型的对象是一个读 - 修改 - 写操作   memory_order_seq_cst内存顺序语义。 98

     

98)可以形成指向原子对象的指针而E具有   整数类型,E ++相当于以下代码序列所在的T   是E的类型:

T *addr = &E;
T old = *addr;
T new;
do {
  new = old + 1;
} while (!atomic_compare_exchange_strong(addr, &old, new));
     

旧的是操作的结果。必须特别小心   如果E有漂浮型;见6.5.16.2。)