ISO/IEC 9899:1999
7.13.1.1 setjmp宏 环境限制4对setjmp宏的调用只应出现在下列上下文中之一:-选择或迭代语句的整个控制表达式;-一个关系运算符或相等运算符的一个操作数与另一个操作数的整数常量表达式,其结果表达式为选择或迭代语句的整个控制表达式;-一个单变量的操作数!运算符,其结果表达式是选择或迭代语句的整个控制表达式;或-表达式语句的整个表达式(可能转换为无效)。
因此,使用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循环的最后一条语句?
发布于 2012-08-31 07:04:35
不,你不能用
int foo = setjmp(buf);
foo = setjmp(buf);后面的原因(赋值)可能是因为赋值是一个表达式,它不仅仅是左边的一个标识符。如果左侧是一个lvalue表达式,则该标准不规定计算子表达式的顺序。所以如果你有
int* f(void);
*f() = setjmp(buf);*f()和setjmp(buf)可以按任何顺序进行评估。由于setjmp对抽象状态机的实际状态进行了快照,因此两个顺序的语义将完全不同。
对于第一行(初始化),我认为这个问题不会发生。因此,我想这可以作为一个有效的用途添加。但是,如果没有仍然需要在左侧进行评估的边界案件,就必须仔细讨论。
(Eric已经回答了选择语句。)
发布于 2012-08-30 19:39:03
选择语句是if (包括if…else)和switch。迭代语句是while、do…while和for。
https://stackoverflow.com/questions/12204143
复制相似问题