c++ 三項演算子と const キーワードの拡張

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 定数のアドレスを取得する場合

 

おすすめ

転載: blog.csdn.net/qq_45526401/article/details/129172848