ISO/IEC 9899:1999
7.13.1.1 setjmp 宏
环境限制 4 应出现 setjmp 宏的调用
仅在以下情况之一: — 整个控制
选择或迭代语句的表达式; — a 的一个操作数
关系运算符或相等运算符,另一个操作数为整数
常量表达式,结果表达式是整个
控制选择或迭代语句的表达; - 这
一元操作数 !运算符,结果表达式为
选择或迭代语句的整个控制表达式;
or — 表达式语句的整个表达式(可能强制转换
作废)。
因此,使用 setjmp 的唯一变体如下:
if (setjmp(buf))
while (setjmp(buf))
for (;; setjmp(buf))
if (setjmp(buf) == 0)
while (setjmp(buf) == 0)
for (;; setjmp(buf) == 0)
if (!setjmp(buf))
while (!setjmp(buf))
for (;; !setjmp(buf))
setjmp(buf);
(void)setjmp(buf);
我们不能使用以下语句:
int foo = setjmp(buf);
foo = setjmp(buf);
正确的?迭代语句是什么意思? for循环的最后一条语句?
不,你不能使用
int foo = setjmp(buf);
foo = setjmp(buf);
后者(赋值)的原因可能是赋值是一个表达式,它的左侧不仅仅是一个标识符。如果左侧是左值表达式,则标准不会强加子表达式的求值顺序。所以如果你有
int* f(void);
*f() = setjmp(buf);
*f()
and setjmp(buf)
可以按任何顺序进行评估。自从setjmp
如果对抽象状态机的实际状态进行快照,则两个命令的语义将完全不同。
我认为,对于第一行(初始化),不会出现此问题。所以我想这可以添加为有效用途。但如果没有边界案例仍需要左侧评估,则必须仔细讨论。
(埃里克已经回复了选择声明。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)