0

コンパイラが右辺値を予期している状況で左辺値が現れると、コンパイラは左辺値を右辺値に変換します。

T が関数または配列型でない場合、型 T の左辺値 e は右辺値に変換できます。変換後の e の型は T になります。

コンパイラがいつ右辺値を期待するのか、または左辺値に還元される式が右辺値に変換されるような正確な規則とは何かを誰かが知ることができますか? Cで可変サイズの配列を宣言しようとすると

  int b=8;
  int a[2*b];     //compiler gives error that constant expression reqd. what is this constant expression (is it rvalue expression)

しかし、私がするとき

int a[10];
 a[2*b]=89;

左辺値から右辺値への変換が発生したときに誰かが詳しく説明してください?? 私の混乱は、最初のケースでは配列添字で左辺値から右辺値への変換が(宣言時に)発生しないが、2番目のケースでは発生することです

4

2 に答える 2

1

古いコンパイラを使用している可能性がありますか、それとも可変長 array( VLA) サポートを有効にする必要がありますか? VLAc99使用している場合は、gcc次のサンプル コードをコンパイルすると、これをより明確に確認できます。

int main()
{
    int b=8;
    int a[2*b];

    return 0 ;
}

次のオプションを使用します。

gcc -std=c89 -pedantic

次のエラーが表示されます。

warning: ISO C90 forbids variable length array ‘y’ [-Wvla]

使用しc99ても問題ありません:

gcc -std=c99 -pedantic 

ただし、2011 年以降、C 標準VLAサポートはオプションになっていることに注意することが重要です。

anlvalueはメモリ位置を持つオブジェクトですが、 anrvalueは通常は式の終わりを超えて持続しない一時的な値です。この記事C および C++ での左辺値と右辺値の理解は、おそらくより詳細な説明の 1 つです。

この場合2*brvalue、式を超えて持続しないためです。

于 2013-07-14T13:20:09.070 に答える