0

以下のコードの出力がどのように「-3」になるのか理解できませんか?

#include <stdio.h>
void main()
{
    int a = -5;
    int k = (a++, ++a);
    printf("%d\n", k);
}

int k = (a++, ++a);c または c++ でのこのステートメントの背後にある概念は何 ですか?

4

4 に答える 4

5

シーケンスポイント,を作成する演算子のために機能します。

§5.19.1 (コンマ演算子)

コンマ演算子は左から右にグループ化します。コンマで区切られた式のペアは、左から右に評価されます。左の式は破棄された値の式です (箇条 5)。左の式に関連付けられたすべての値の計算と副作用は、右の式に関連付けられたすべての値の計算と副作用の前に並べられます。結果の型と値は、右側のオペランドの型と値です。結果は、右オペランドと同じ値カテゴリであり、右オペランドが glvalue とビット フィールドの場合はビット フィールドです。右側のオペランドの値が一時的 (12.2) である場合、結果はその一時的です。

したがって:

  1. aに初期化され-5ます。
  2. 次にa++実行し、変更aします-4.
  3. 次に++a実行し、 に変更a-3、 に戻り-3ますk
于 2015-06-29T12:15:32.250 に答える
1

これは、C と C++ の両方で完全に明確に定義されています。

コンマで区切られた式は、左から右に評価されます。

式全体の値は、2 番目の式の値になります。

したがって、分解する(a++, ++a)には、a++が最初に評価され (次に-4 a)、結果 (-5)が破棄++aされてから評価されます。その値 (-3) が に割り当てられkます。

于 2015-06-29T12:17:45.783 に答える
1

ここでは、初期化子としてカンマ演算子を使用した式が使用されています

int k = (a++, ++a);

C 標準によると (同じことが C++ にも有効です) (6.5.17 コンマ演算子):

2 コンマ演算子の左側のオペランドは void 式として評価されます。その評価と右オペランドの評価の間にはシーケンス ポイントがあります。次に、右側のオペランドが評価されます。結果には型と値があります

最初に変数 a は -5 で初期化されました

int a = -5;

したがって、コンマ演算子の最初の式を評価した後、「その評価と右オペランドの評価の間にシーケンス ポイントがある」という事実により、a は -4 (a++) に等しくなります。コンマ演算子を使用した式全体の結果は、正しい式を評価した後の値になります++a。その値は-3

したがって、変数 k は -3 で初期化されます。同じ値には変数 a があります。

于 2015-06-29T12:22:18.753 に答える
1

これは未定義の動作ではありません

あなたのコードでは、

 int k = (a++, ++a);

「コンマ演算子」を利用しています。agets に初期化された後-5、基本的には、

  • 実行し、結果a++を破棄します。ポストの副作用、今は++a-4
  • 遭遇,、シーケンスポイント。
  • 実行し、結果++aを返します。は現在(pre- ) であり、 に割り当てられます。a-3++k

参照:C11規格の章から6.5.17

コンマ演算子の左側のオペランドは void 式として評価されます。その評価と右オペランドの評価の間にはシーケンス ポイントがあります。次に、右側のオペランドが評価されます。結果には型と値があります。

于 2015-06-29T12:15:46.707 に答える