3

私はこの行動に少し困惑しています。誰でも説明できますか

  void Decrement(int* x){
        *x--; //using this line, the output is 5 

        //*x=*x-1; //using this l ine, the output is 4

    }

    int main(){
        int myInt=5;
        Decrement(&myInt);
        cout<<myInt<<endl;
        return 0;
    }

    Output: 5
4

6 に答える 6

8

*x--を意味し*(x--)ます。つまり、プログラムはx、それが指すものではなく、 を変更します。値で渡されるため、その変更は には影響しませんmain()。コメント行と一致させるには、 を使用する必要があります(*x)--

于 2013-01-25T06:15:27.613 に答える
3

試してみてください(*x)--;

コードはポインターをデクリメントし、それを逆参照して値を破棄しています。

于 2013-01-25T06:16:28.823 に答える
2

これは演算子の優先順位の問題です。

--演算子は逆参照演算子 ( ) よりも優先されます*。したがって、実際に行っていることは、単に x の位置より下の 1 つのメモリ位置にある値にアクセスすることです (そして、何もしません)。

あなたがおそらくやりたいと思うのは、「参照によって」xを渡すことです。それは次のようになります。

void Decrement(int& x){
    x--;
}

int main(){
    int myInt = 5;
    Decrement(myInt);
    cout << myInt << endl;
    return 0;
}

*参照によって値を渡すと、C++ は自動的にポインターを逆参照します。これが、Decrement 関数で が不要になった理由です。

于 2013-01-25T06:17:54.423 に答える
2

(*x)-- を期待していて、*(x--) を取得しています。その理由は、操作の優先順位です。調べる。「逆参照アドレス」の前にプレインクリメントとポストインクリメントをバインドします。

于 2013-01-25T06:19:20.070 に答える
2

基本的に、ポインターxを値で渡します。その結果x、関数内の (それが指している対象ではなく)変更は にvoid Decrement(int*)反映されませんmain()。このコードは、意図したことを実現します。

void Decrement(int& x)
    {
        x--;

    }

int main()
    {
        int myInt=5;
        Decrement(myInt);
        cout<<myInt<<endl;
        return 0;
    }

    Output: 4

これは、変数への参照 (またはアドレス) が渡される参照渡しです。

于 2013-01-25T06:34:55.137 に答える
1

*x--は と同等*(x--)です。

于 2013-01-25T06:16:05.063 に答える