这段代码的输出是否定义良好?我认为它在两个连续的序列点之间不止一次地更新变量。
#include<stdio.h> int main() { int p=10,*q; q= &p; *q=p+++*q; printf("%d",*q); return 0; }
nuypyhwy1#
此代码显示undefined behavior。C standard的第6.5p2节规定:如果标量对象上的副作用相对于同一标量对象上的不同副作用或使用同一标量对象的值进行的值计算是无序的,则该行为是未定义的。如果一个表达式的子表达式有多个允许的排序,则如果在任何排序中出现这种未排序的副作用,则该行为是未定义的因为q包含p的地址,所以表达式*q=p+++*q;将p写入两次(一次是直接在p上使用后递增运算符,另一次是在赋值给*q时),而没有插入序列点或其他顺序操作。这违反了上面不允许在一个对象上有多个未排序的副作用的子句。
q
p
*q=p+++*q;
*q
1条答案
按热度按时间nuypyhwy1#
此代码显示undefined behavior。
C standard的第6.5p2节规定:
如果标量对象上的副作用相对于同一标量对象上的不同副作用或使用同一标量对象的值进行的值计算是无序的,则该行为是未定义的。如果一个表达式的子表达式有多个允许的排序,则如果在任何排序中出现这种未排序的副作用,则该行为是未定义的
因为
q
包含p
的地址,所以表达式*q=p+++*q;
将p
写入两次(一次是直接在p
上使用后递增运算符,另一次是在赋值给*q
时),而没有插入序列点或其他顺序操作。这违反了上面不允许在一个对象上有多个未排序的副作用的子句。