Pas*_*uoq 21 c c99 sequence-points
相关问题:赋值运算符不是序列点的任何充分理由?
从comp.lang.c FAQ我会推断下面的程序是未定义的.奇怪的是,它只是f
在参数计算和控制转移之间提到了作为序列点的调用f
.从f
后面到调用表达式的控制转移未列为序列点.
int f(void) { i++; return 42; }
i = f();
Run Code Online (Sandbox Code Playgroud)
它真的未定义吗?
作为我在我的许多问题中添加的最后一点,我对静态分析的背景感兴趣.我不是自己写的,我只是想知道我是否应该在其他人编写的程序中对此进行警告.
从f返回到调用表达式的控制转移未列为序列点.
是的.
在评估完整表达结束时
构成表达式语句的完整表达式,或if,switch,while,for或do/while语句的控制表达式之一,或初始化程序或return语句中的表达式.
你有一个return语句,因此,你有一个序列点.
它甚至没有出现
int f(void) { return i++; } // sequence point here, so I guess we're good
i = f();
Run Code Online (Sandbox Code Playgroud)
未定义.(对我来说有点奇怪.)
这根本不是未定义的.C99附录C中列出的序列点之一是完整表达式的结束,其中一个是return语句中的表达式.
由于您返回42,因此紧跟该return
语句后会有一个序列点.
为了完整起见,此处列出了C99序列点,相关的一个加粗:
以下是5.1.2.3中描述的序列点: