首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >标准定义的setjmp备注

标准定义的setjmp备注
EN

Stack Overflow用户
提问于 2012-08-30 19:32:47
回答 2查看 185关注 0票数 4

ISO/IEC 9899:1999

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

因此,使用setjmp的唯一变体如下:

代码语言:javascript
复制
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);

我们不能用这个说法:

代码语言:javascript
复制
int foo = setjmp(buf);
foo = setjmp(buf);

对吗?迭代语句是什么意思?for循环的最后一条语句?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-31 07:04:35

不,你不能用

代码语言:javascript
复制
int foo = setjmp(buf);
foo = setjmp(buf);

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

代码语言:javascript
复制
int* f(void);
*f() = setjmp(buf);

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

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

(Eric已经回答了选择语句。)

票数 4
EN

Stack Overflow用户

发布于 2012-08-30 19:39:03

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12204143

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档