setjmp备注由标准定义

时间:2012-08-30 19:32:47

标签: c

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循环的最后一个陈述?

2 个答案:

答案 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。迭代语句为whiledo…whilefor