1. ホーム
  2. c++

[解決済み] C++のforループに2つのincrement文を入れるにはどうしたらいいですか?

2023-01-13 16:07:28

質問

の中で2つの変数をインクリメントしたい。 for -ループ条件において、1つではなく2つの変数をインクリメントしたいです。

のようなものですね。

for (int i = 0; i != 5; ++i and ++j) 
    do_something(i, j);

これはどのような構文ですか?

どのように解決するのですか?

よくあるイディオムとして カンマ演算子 を使うことです。これは両方のオペランドを評価し、2 番目のオペランドを返します。このように

for(int i = 0; i != 5; ++i,++j) 
    do_something(i,j);

しかし、本当にコンマ演算子なのでしょうか?

今これを書いたら、コメント提供者が、それは実際には for 文の中の特別な構文上の糖であり、まったくカンマ演算子ではないことを示唆しました。私は以下のように GCC でそれをチェックしました。

int i=0;
int a=5;
int x=0;

for(i; i<5; x=i++,a++){
    printf("i=%d a=%d x=%d\n",i,a,x);
}

x が a の元の値を拾うことを期待していたので、x には 5,6,7... と表示されるはずだったのですが、このような結果になりました。

i=0 a=5 x=0
i=1 a=6 x=0
i=2 a=7 x=1
i=3 a=8 x=2
i=4 a=9 x=3

しかし、パーサーが本当にカンマ演算子を見るように式を括弧で囲むと、次のようになります。

int main(){
    int i=0;
    int a=5;
    int x=0;

    for(i=0; i<5; x=(i++,a++)){
        printf("i=%d a=%d x=%d\n",i,a,x);
    }
}

i=0 a=5 x=0
i=1 a=6 x=5
i=2 a=7 x=6
i=3 a=8 x=7
i=4 a=9 x=8

当初、これはコンマ演算子として動作していないことを示していると思いましたが、結局のところ、これは単に優先順位の問題であり、コンマ演算子には 可能な限り低い優先順位 であるため、式 x=i++,a++ は事実上 (x=i++),a++ として解析されます。

すべてのコメントをありがとうございました。興味深い学習体験でした!私は長年Cを使ってきました。