0

インクリメントオペランドとして左辺値が必要な理由a=b +(++ c ++);のエラー

'b +(c + 1)'を'a'に割り当て、'C'を同時に2インクリメントしたかっただけです。

私は初心者ですが、実際には「LVALUE ERROR」とは何かを明確にしたいと思っていましたか?

main()
{

int a=1,b=5,c=3;

a=b+(++c++);  

printf("a=%d   b= %d   c= %d \n",a,b,c);
}
4

2 に答える 2

8

後置のインクリメントは、プレフィックスのインクリメントよりも厳密にバインドされるため、次のようなものが必要になります。

a = b + (++c)++;

ただし、プレフィックスインクリメントの結果(例のポストフィックスインクリメントの結果など)はlvalueではないため、これは正当な C ではありません。これは単なる値であることを意味します。'c' のような特定のオブジェクトを参照しなくなったため、変更しようとしても意味がありません。オブジェクトが更新されないため、目に見える効果はありません。

個人的には、いずれにしても 2 つのステートメントで行う方が明確だと思います。

a = b + c + 1;
c += 2;
于 2012-10-11T07:12:09.037 に答える
3

LVALUE は、操作が実行されるはずの変数がないことを意味します。

Cファイルは基本的にテキストファイルに他ならず、特定のフォーマットを必要とするため、コンパイラはそれを理解できます。

++Variable++ のようなものを書くことは、コンパイラにとって完全にナンセンスです。

基本的に ++c は次のように想像できます。

Var += 1;
return Var;

c ++は次のとおりです。

int Buf = Var;
Var += 1;
return Buf;

コードを「修復」するには:

void main() {
    int a=1,b=5,c=3;
    a = b + (++c);  //Equals 5 + 4
    printf("a=%d   b= %d   c= %d \n",a,b, ++c);  //a = 9, b = 5, c = 5
}

このようにして、コンパイラが不平を言うことなく、必要な結果を得ることができます。

複合操作で ++c または c++ を使用する場合、順序が重要であることを覚えておいてください。++cを使用する場合は高い方の値で動作し、c++を使用する場合は古い値で動作します。

つまり、次のことを意味します。

int a, c = 5;
a = 5 + ++c;  //a = 11

その間

int a, c = 5;
a = 5 + c++;  //a = 10

後者の場合、c は 5 に加算されて a に格納された後にのみ '6' になるためです。

于 2012-10-11T07:17:23.633 に答える