根据序列点定义,序列点是执行序列中称为序列点的<#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?
答案 0 :(得分:5)
i++
评估以前的i
值。
由于i
的副作用值增加1
。
是的,序列点在那里,但表达式i++
评估为0
(尽管i
的值同时为1
)
来自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。)