0

私は本の中でこのコードを見つけました:

#include <iostream>
using namespace std;

void ChangesAreGood(int *myparam) {
    (*myparam) += 10;
    cout << "Inside the function:" << endl;
    cout << (*myparam) << endl;
}

int main() {
    int mynumber = 30;
    cout << "Before the function:" << endl;
    cout << mynumber << endl;

    ChangesAreGood(&mynumber);
    cout << "After the function:" << endl;
    cout << mynumber << endl;

    return 0;
}

それは言う:

(*myparam) += 10;

次の違いは何を生み出すでしょうか?

*myparam += 10;
4

1 に答える 1

5

あなたの質問に答えるには:

あなたの例では、読みやすさ以外に違いはありません。

そして、この投稿へのコメントがすべて示唆しているように、ここでは括弧を使用しないでください...

興味深い他のケース

逆参照されたオブジェクトのプロパティ/メソッドの使用

一方、あなたが次のようなものを持っている場合は違いがあります

*myObject.myPropertyPtr += 10

に比べ

(*myPointer).myProperty += 10

ここで選択した名前は、違いが何であるかを示しています。間接参照演算子*は、右側にあるものすべてに対して機能します。前者の場合、ランタイムはの内容をフェッチし、myObject.myPropertyPtrそれを逆参照しますが、2番目の例では、を逆参照し、を指すオブジェクトで見つかったものからmyPointer取得します。myPropertymyPointer

後者は非常に一般的であるため、独自の構文もありますmyPointer->myProperty

++ではなく演算子を使用する+=

この質問に対する別の(現在は削除されている)回答を読んだ後で考えたもう1つの興味深い例は、これらの違いです。

*myPointer++
(*myPointer)++
*(myPointer++)

これがより興味深い理由は、++が他の呼び出しと同様であり、特に左側と右側の値を処理しないため、を使用した例よりもあいまいであるためです+=。(もちろん、それらは常に意味があるとは限りません-場合によっては++、それをサポートしないオブジェクトで演算子を使用しようとすることになります-しかし、私たちの研究をintsに制限すれば、これは問題にはなりません。とにかくコンパイラエラーが発生するはずです...)

あなたが私の好奇心をつかんだので、私はこれらをテストする小さな実験を行いました。これは私が見つけたものです:

  • *myPointer++と同じことを行います。*(myPointer++)つまり、最初にポインタをインクリメントしてから逆参照します。これはそれほど驚くべきことではありません-実行の結果を知ることで私たちが期待すること*myObject.somePropertyです。

  • (*myPointer)++期待どおりの動作を行います。つまり、最初にポインタを逆参照してから、ポインタが指しているものインクリメントします(そしてポインタをそのままにします)。

必要に応じて、これを見つけるために使用したコードを詳しく調べてください。に保存し、 (G ++がインストールされていると仮定してdereftest.cpp)でコンパイルし、で実行するだけです。g++ dereftest.cpp -o dereftest./dereftest

于 2013-02-09T19:17:52.187 に答える