c++ が c を拡張したことは誰もが知っているので、今日は三項演算子と const キーワードの拡張機能を共有します。
三項演算子の機能強化
int main30()
{
int a = 10;
int b = 20;
//返回一个最小数 并且给最小数赋值成3
//三目运算符是一个表达式 ,表达式不可能做左值
(a < b ? a : b) = 30;
printf("a = %d, b = %d\n", a, b);
system("pause");
return 0;
}
これを c 言語で記述した場合、コンパイラは左辺値が変更可能である必要があると報告します.これは、 a < b ? a : b が c 言語コンパイラで特定の値、つまり 10=30 を返すためです。これは明らかに間違っています。 .
しかし、それはC ++で動作します
C++ コンパイラはそれを最適化し、そのアドレスを返します。
*(a < b ? &a : &b) = 30; を c 言語で記述できます。つまり、返されるのは彼のアドレスであり、値を取得する際の間接代入に相当します。
結論は:
1) C 言語は変数の値を返し、C++ 言語は変数自体を返します。
C 言語の三項演算子は変数値を返し、左辺値として使用できません
C++ の三項演算子は、変数自体を直接返すことができるため、プログラムのどこにでも表示できます。
2)注:三項演算子によって返される可能性のある値の1つが定数値である場合、左辺値として使用することはできません
(a < b ? 1 : b )= 30;
3) C 言語は C++ と同様の機能をどのようにサポートしていますか?
====>左辺値であるための条件: メモリ空間が必要です; C++ コンパイラはプログラマがアドレスを取得するのを助けます
const キーワードの機能強化
最初にコードを見てください
int main()
{
const int a;
int *p = NULL;
p = &a;
*p = 20;
printf("a:%d\n", a);
system("pause");
return 0;
}
これは c 言語で実行した結果です。a 変数自体の値は、間接代入によって変更できます。
これは c++ です。a の値が変更されていないことがわかります。これは、c++ コンパイラが const キーワードを最適化し、const で宣言された変数に定数を保存するためのシンボル テーブルがあるためです。
結論は:
C言語のconst変数
C 言語の const 変数は読み取り専用の変数であり、独自のストレージ スペースがあります。
C++ の const 定数
ストレージが割り当てられる場合と割り当てられない場合があります
const 定数がグローバルで、他のファイルで使用する必要がある場合
& 演算子を使用して const 定数のアドレスを取得する場合