4

ISO/IEC 9899:1999

7.13.1.1 setjmp 宏

环境限制 4 setjmp 宏的调用应仅出现在以下上下文之一中: — 选择或迭代语句的整个控制表达式;— 关系或相等运算符的一个操作数与另一个操作数为整数常量表达式,结果表达式是选择或迭代语句的整个控制表达式;— 一元的操作数!运算符,其结果表达式是选择或迭代语句的整个控制表达式;或 — 表达式语句的整个表达式(可能强制转换为 void)。

因此,使用 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 循环的最后一条语句?

4

2 回答 2

3

不,你不能使用

int foo = setjmp(buf);
foo = setjmp(buf);

后面(赋值)的原因可能是赋值是一个表达式,它可以不仅仅是左侧的标识符。如果左侧是左值表达式,则标准不规定评估子表达式的顺序。所以如果你有

int* f(void);
*f() = setjmp(buf);

*f()并且setjmp(buf)可以按任何顺序进行评估。由于setjmp对抽象状态机的实际状态进行了快照,因此两个命令的语义将完全不同。

我认为,对于第一行(初始化),这个问题不会发生。所以我想这可以作为有效用途添加。但是,如果没有边界案件仍然需要对左侧进行评估,则必须仔细讨论。

(埃里克已经回复了选择声明。)

于 2012-08-31T07:04:35.980 回答
2

选择语句是if(包括if…else)和switch。迭代语句是whiledo…whilefor

于 2012-08-30T19:39:03.143 回答