1

これを解決するのを手伝ってください。その式に続く手順は次のとおりです。

//Expression
offSpring1[m1++] = temp1;

//手順:

1.- インクリメント m1

2.- temp1 を offSpring に割り当てます

カッコ内の表現が先だとずっと思っていました。しかし今、私は混乱しています。したがって、これを書く場合:

//Expression
offSpring1[++m1] = temp1;
//Steps would be:

1.- assign temp1 to offSpring
2.- increment m1

手順が最初の手順と同じである場合、i++ と ++i の違いは何ですか?

4

10 に答える 10

8
int i = 0;
std::cout << i++ << std::endl;
std::cout << i << "\nreset" << std::endl;
i = 0;
std::cout << ++i << std::endl;
std::cout << i << std::endl;

出力:

0
1
reset
1
1

i++式の現在の値を返し、変数をインクリメントします。 ++i変数をインクリメントし、現在の式で使用する値を返します。

于 2012-02-15T17:21:12.487 に答える
4
offSpring1[m1++] = temp1;

offSpring1[m1] = temp1;
m1 += 1;

offSpring1[++m1] = temp1;

m1 += 1;
offSpring1[m1] = temp1;
于 2012-02-15T17:23:19.557 に答える
1

これら 2 つの異なるテスト プログラムを実行して、ポスト インクリメント演算子とプリインクリメント演算子の違いを理解してください。

++i の場合 (プリインクリメント)

int main()
{
    int* offSpring = calloc(20,sizeof(int));
    int m1 =1;
    offSpring[++m1] = 10;
    printf("%d,%d",offSpring[m1],m1);
}

最初のものでは、offSpring[m1] の値として 10 を取得します。なんで?これはプレインクリメント演算子であるため、最初の m1 がインクリメントされ、残りが評価されることを意味します。

i++ の場合 (ポストインクリメント)

int main()
{
    int* offSpring = calloc(20,sizeof(int));
    int m1 =1;
    offSpring[m1++] = 10;
    printf("%d,%d",offSpring[m1],m1);
}

2 番目では、post-increment 演算子が使用されているため、最初に offSpring[m1] に 10 を割り当ててから m1 がインクリメントされるため、0 の値が得られます。

于 2012-02-15T17:23:57.987 に答える
1
  • j = ++iと同じですi = i+1; j = i;
  • j = i++と同じですj = i; i = i+1;
于 2012-02-15T17:26:34.177 に答える
0

残念ながら、そこに投稿した 2 つのコード スニペットでは、評価の順序が保証されていません。あなたの表現が不適切であれば、多かれ少なかれ何かが起こる可能性があります。

a++ と ++a の違いから始めます。

  • a++ は a をインクリメントしますが、それを使用する式では、インクリメントの前に a の値が表示されます
  • ++a は a をインクリメントし、それを使用する式にはインクリメントされた値が表示されます。
  • リスト項目

buffer[a++] = b;

コンパイラは、式内の任意のポイントで ++ を実行することを決定できます。したがって、'b' が実際に a を含む式である場合、異なるコンパイラでは異なる結果が得られます。次の両方が有効です。

  • a の値を取得します。
  • インクリメント
  • バッファ[古い値]が指す場所を見つけます
  • bを評価する
  • b店

またはこれ

  • bを評価します。
  • buffer[a] が指している場所を調べます
  • b店
  • インクリメント

「b」がたまたま a を含む場合、これら 2 つの実装は異なる結果を生成します。どちらも有効です。

于 2012-02-15T17:58:44.090 に答える
0

式 (またはサブ式) には、その値とその副作用という 2 つの側面があります。の値i ++は の値ですi。の値はの型に変換され++ iた値です。これは、式で使用される値です。両方の副作用は、変数をインクリメントすることです。これは、前のシーケンス ポイントの後、次のシーケンス ポイントの前の任意の時点で発生する可能性があります。がグローバル変数であると仮定すると、次のように記述します。i + 1iii

i = 0;
f()[i ++] = g();
f()[++ i] = g();

標準では、 orでi見られる値がインクリメントの前か後かについては何も述べていません。どちらの場合も。標準が言っているのは、インクリメントの効果が完全な式の開始後(ただし、おそらく完全な式の最初のものとして)、その終了前に発生するということだけです。(そして、それらは関数呼び出しでインターリーブされないため、 2 回 読み取った場合に同じ値が表示されることが保証されます。)f()g()f()i

于 2012-02-15T17:37:45.413 に答える
0

offSpring1[m1++] = temp1;あなたが言ったことをしません。

  1. temp_m1 = m1 を割り当てます。
  2. m1 をインクリメントします。
  3. 索引offSpring1[temp_m1]
  4. temp1インデックス付きの値に割り当てます。

一方、次のoffSpring1[++m1] = temp1;ように機能します。

  1. m1 をインクリメントします。
  2. 索引offSpring1[m1]
  3. temp1インデックス付きの値に割り当てます。
于 2012-02-15T17:22:45.237 に答える
0

最初の説明は、2 番目の正しい説明です。最初の正しい説明は非常に似ています。「m1 の現在の値をコピーする」ステップを他のステップの前に追加する必要があるだけです。

m1ただし、プリミティブ型の場合、ここではシーケンス ポイントが明確に不足しています。規則は、C++03 と C++11 の間で多少異なります。

ユーザー定義型の場合m1、順序付けに影響を与える関数呼び出しが含まれます。


このコード

offSpring1[m1++] = temp1;

以下を実行します (m1プリミティブ型の場合):

auto const old_m1(m1);
auto const new_m1(old_m1 + 1);
auto& lhs(offSpring[old_m1]);
parallel { lhs = temp1; m1 = new_m1; }

このコード

offSpring1[++m1] = temp1;

の代わりに をlhs使用してバインドされていることを除いて、まったく同じです。new_m1old_m1

lhsどちらの場合も、が before に書かれているか after に書かれているかは未定m1です。

m1がプリミティブ型でない場合は、次のようになります。

auto const& index = m1.operator++(0); // one argument
auto& lhs = offSpring.operator[](index);
lhs = temp1;

auto const& index = m1.operator++(); // no arguments
auto& lhs = offSpring.operator[](index);
lhs = temp1;

どちらの場合も、 への変更m1は への書き込みの前に確実に行われlhsます。

于 2012-02-15T17:24:04.157 に答える
0

最初の例では後置インクリメントが最初に評価されますが、その値はインクリメントされる変数の元の値です。

offSpring1[m1++] = temp1;

したがって、 m1 は配列のイデックス処理の前にインクリメントされますが、 の値はtemp1position に割り当てられm1 - 1ます。

于 2012-02-15T17:24:06.750 に答える
0

あなたが説明したこととは正反対に機能します:

offSpring1[m1++] = temp1と同じです offSpring[m1] = temp1; m1 = m1 + 1;

OffSpring1[++m1] = temp1と同じです m1 = m1 + 1; OffSpring1[m1] = temp1;

式を評価する前に前置記法がインクリメントする 式を評価した後に後置記法がインクリメントする

于 2012-02-15T17:24:16.357 に答える