やあみんな
今日はこのプログラムを作りました
int main()
{
int a = 1,2; /* Shows error */
int b = (1,2); /* No error */
}
最初のエラーが表示され、2 番目のエラーが表示されないのはなぜですか? ( ) だけで 1 つのプログラムがコンパイルされます。なんで?
――シュルティ
やあみんな
今日はこのプログラムを作りました
int main()
{
int a = 1,2; /* Shows error */
int b = (1,2); /* No error */
}
最初のエラーが表示され、2 番目のエラーが表示されないのはなぜですか? ( ) だけで 1 つのプログラムがコンパイルされます。なんで?
――シュルティ
int a = 1,2;
2
数字で始まる変数名として扱われるため、エラーが発生します。
int b = (1,2);
コンマ演算子はオペランドを左から右に評価し、リストの最後の式を返します。2
括弧内で、言語は式が発生することを指定します。その場合 ( b
)、コンマは C のコンマ演算子を表します。
括弧がない場合、言語は、変数宣言がコンマで区切られることを指定します。の例でa
は、コンパイラ (パーサー) は追加の変数宣言を予期しています。
その理由は、最初のステートメントint a = 1,2;
でコンマがシーケンス演算子として解析されていないためです。2
これは宣言リストの一部であり、言語で許可されていない名前の整数変数をインスタンス化しようとしています。
2 番目のステートメントの括弧によりint b = (1,2);
、コンマがシーケンス演算子として解析されるように強制されます。
(1,2)
リストの最後の式、つまり に評価され2
ます。
別の例:(a,b,c)
と評価されc
ます。
小数を使用する場合は、float/double 型を使用し、小数点記号としてドットを使用します。double d = 1.2;
それらのどれも、最初は意味がありませんでした。
しかし、その後、for ループでの複数の操作を思い出しました。例えば:
for (a=1,b=2; a<1; a++)
1が有効な式であり、式が有効な言語要素であることを知っているので、私の結論は、(1,2)は 1 を評価し (ただし、何もしません)、次に 2 を評価して 2 を返すということです。
そして最後に:
b = (1,2);
前と同じように 1 と 2 を評価し、2 を返し、それを b に代入します。