5

タイトルでかなり明確だと思います。私はこれについて完全には確信が持てず、Google を介して適切な答えを見つけることができません (悲しいかな、私は標準化の芸術に取り組んでいません)。

int i = x++, j = x++;

これは定義されていますか?通常のステートメントは未定義の動作になると確信していますが、コンマ演算子はシーケンスポイントであり、合法ですが、初期化子がセミコロンで終了するか、次の変数が宣言され始めるかについて明確なソースはありません、そしてそれは使用中のコンマ演算子ではないため、明確な答えが見つかりません。したがって、a) コンマがイニシャライザを終了し、シーケンス ポイントであり、それが機能するか、b) 機能しないかのいずれかです。それはどれですか?i = x++, j = x++;

そして、排除するために、私は頭痛を単純化して、次のように書くべきであることを知っています:

int i = x++;
int j = x++;

そして、それが定義されていることを保証します。好奇心からさらに質問します。

4

2 に答える 2

11

イニシャライザの最後はシーケンス ポイントであるため、タイトルの例は有効です。

コンマ演算子はシーケンス ポイントでもあるため、「通常のステートメント」有効で明確に定義されています。

ウィキペディアの記事には、C および C++ シーケンス ポイントのリストがあります。

以下のコメントをフォローアップするために、FreeBSD の stdio.h (下ifndef __GNUC__)に保存されているコンマ演算子の恐ろしい力のデモを次に示します。

/*
 * This has been tuned to generate reasonable code on the vax using pcc.
 */
#define __sputc(c, p) \
        (--(p)->_w < 0 ? \
                (p)->_w >= (p)->_lbfsize ? \
                        (*(p)->_p = (c)), *(p)->_p != '\n' ? \
                                (int)*(p)->_p++ : \
                                __swbuf('\n', p) : \
                        __swbuf((int)(c), p) : \
                (*(p)->_p = (c), (int)*(p)->_p++))
#endif
于 2010-10-31T02:50:24.157 に答える
-5

それはトリッキーな質問です。あなたが書いた場合:

int i = 0, j = 0, x = 10;
i = x++, j = x++;

私は言った:それは未定義です。(さまざまな C および C++ 標準では未定義のままです)

しかし、初期化子ではよくわかりません;D ofcも未定義であると結論付けましたが、誰が知っていますか...

アンジェロ

于 2010-10-31T02:51:29.783 に答える