gpt4 book ai didi

c - setjmp 注释由标准定义

转载 作者:太空狗 更新时间:2023-10-29 15:30:01 25 4
gpt4 key购买 nike

ISO/IEC 9899:1999

7.13.1.1 The setjmp macro

Environmental limits 4 An invocation of the setjmp macro shall appear only in one of the following contexts: — the entire controlling expression of a selection or iteration statement; — one operand of a relational or equality operator with the other operand an integer constant expression, with the resulting expression being the entire controlling expression of a selection or iteration statement; — the operand of a unary ! operator with the resulting expression being the entire controlling expression of a selection or iteration statement; or — the entire expression of an expression statement (possibly cast to 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循环的最后一条语句?

最佳答案

不,你不能使用

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

后来(赋值)的原因可能是赋值是一个表达式,它可以在左侧不仅仅是一个标识符。如果左侧是左值表达式,则标准不强制计算子表达式的顺序。所以如果你有

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

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

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

(Eric 已经回复了选择声明。)

关于c - setjmp 注释由标准定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12204143/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com