4

ISO / IEC 9899:1999

7.13.1.1setjmpマクロ

環境制限4setjmpマクロの呼び出しは、次のコンテキストのいずれかでのみ表示されます。—選択または反復ステートメントの制御式全体。—関係演算子または等式演算子の一方のオペランドと、もう一方のオペランドは整数定数式であり、結果の式は、選択ステートメントまたは反復ステートメントの制御式全体になります。—単項のオペランド!結果の式が選択ステートメントまたは反復ステートメントの制御式全体である演算子。または—式ステートメントの式全体(おそらく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、両方の順序のセマンティクスは完全に異なります。

最初の行(初期化)では、この問題は発生しないと思います。したがって、これは有効な用途として追加できると思います。しかし、左側でまだ評価が必要な境界ケースがない場合は、慎重に議論する必要があります。

(Eric はすでに選択ステートメントに対して返信しています。)

于 2012-08-31T07:04:35.980 に答える
2

選択ステートメントはif(を含むif…else) およびswitchです。反復ステートメントはwhiledo…while、およびforです。

于 2012-08-30T19:39:03.143 に答える