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循环的最后一个陈述?
答案 0 :(得分:3)
不,你不能使用
int foo = setjmp(buf);
foo = setjmp(buf);
后面(赋值)的原因可能是赋值是一个表达式,左边可能只有一个标识符。如果左侧是左值表达式,则标准不会对子表达式进行评估。所以,如果你有
int* f(void);
*f() = setjmp(buf);
可以按任何顺序评估 *f()
和setjmp(buf)
。由于setjmp
生成抽象状态机的实际状态的快照,因此两个命令的语义将完全不同。
对于第一行(初始化),我认为不会出现这个问题。所以我想这可以添加为有效用途。但如果没有边界案例仍然需要在左侧进行评估,则必须仔细讨论。
(Eric已经回复了选择陈述。)
答案 1 :(得分:2)
选择语句为if
(包括if…else
)和switch
。迭代语句为while
,do…while
和for
。