2

単項演算子が1の補数、論理否定、および事前インクリメントのためにCでどのように機能するかについて混乱しています。

1の補数は、次のように0に対して機能します。

int main()
{
    int a;
    a = ~0;          // Ones complement
    printf("%d",a);  // prints as -1.
}

そして、論理否定は次のように0に対して機能します。

int main()
{
    int a;
    a = !0;          // Logical negation
    printf("%d",a);  // prints as 1.
}

ただし、0に対するプリインクリメントは、コンパイラエラーを生成します。

int main()
{
    int a;
    a = ++0;        //pre incrementing 0.  error: non-lvalue in increment
    printf("%d",a); 
}

3つすべてが単項演算子であると考えて、3つすべてが機能しないのはなぜですか?

4

3 に答える 3

12

インクリメント(++)およびデクリメント(--)演算子は、それに続くものを変更します。リテラルまたは定数を変更することはできません。対照的に、!and~演算子は値を操作するだけで、結果をどこにも割り当てません。

大まかに言えば、++nを意味しn = n + 1; nます。つまり、「の値を取得しn、それに1を追加し、その値をに書きn戻し、式の値として新しい値を返します。」つまり、「の値を取得し、それに1を追加し、それをに書き戻して、式の結果として新しい値を返す」++0という意味になります。リテラルと定数を左側の値にすることはできません(それらに割り当てることはできません)。0 = 0 + 1; 000

対照的に、~nは「の値を取り、nそれにビット単位のNOT演算を適用し、式の結果として結果を返す」ことを意味します。nは変更されず、~更新された値をそのオペランドに書き戻しません。

したがって、たとえば:

int n = 0;
int a;
a = ~n;
printf("a = %d, n = %d\n", a, n); // "a = -1, n = 0" -- `n` is unchanged

対。

int n = 0;
int a;
a = ++n;
printf("a = %d, n = %d\n", a, n); // "a = 1, n = 1" -- `n` is changed

インクリメント(++)とデクリメント(--)は、その点で!or ~(または他の単項演算子-少なくとも、オペランドを変更する他の演算子をすぐに考えることはできません)とは異なります。

于 2011-06-28T06:27:06.547 に答える
4

++値に操作を適用するだけで--なく、値自体を変更します。この動作は、文字通りにはあまり意味がありません。

参照する他の単項演算子(つまり~、および!)は、オペランドの値を変更せず、その値に対して演算を実行するだけです。

于 2011-06-28T06:27:23.913 に答える
2

リテラル値をインクリメントしようとしています。操作x++以降; x = x+1の同義語です。これは、変数ではない0に新しい値を設定しようとしていることを意味します。

于 2011-06-28T06:29:34.260 に答える