次のコードを検討してください。
float d = 3.14f;
int i = 1;
auto sum = d + i;
cppreference.com によると、i
は、float
に追加するときにd
に変換する必要があります。しかし、実際にコードを実行すると、sum
が4であることがわかります。これはなぜですか?
興味深いことに、コンパイラを明示的にC11モードにすると、sum
が4.14であることがわかりました。 C11標準は、結果に影響するどのような規則を変更しますか?
C++コンパイラを使用して同じコードをコンパイルするとどうなりますか?
C(およびC++)では、3.14f + 1
は、float
からint
への型昇格のため、float
型です。
ButC90まで、およびそのような標準はCコンパイラのデフォルトである可能性があります。これはint
型に割り当てられ、int
自動保存期間を持つ変数のデフォルトタイプです。 C99以降、暗黙のintが撤回されたため、コンパイルは失敗しますが、コンパイラーはまだ警告を出して許可しています。
(C++ 11以降では、auto
は型を推測するようコンパイラーに指示します。sum
は値3.14f + 1
のfloat
になります。C++ 98またはC++ 03としてコンパイルしても動作する場合がありますが、C++に関する警告が生成されます11個の拡張機能 これは、たとえばclangが行うことです 。このC++ 11でのauto
の再定義は、CとC++の間の別の重要な相違を表しています。)
本当に簡単です。
古いバージョンのC(C99より前)では、次のように書くことができます。
auto n = 3;
n
は、値が3のint
型になります。
auto n = 3.14f;
そしてn
はstillは値が3のint
タイプです。
これは暗黙のintと呼ばれ、K&Rはそれを非常に有名にしました。
あなたはそれを見ることができます
auto sum = d + i;
float
type d + i
を、暗黙的なsum
であるint
に割り当てるだけです。
したがって、答え4。
Cの新しいバージョン(C99以降)では、暗黙的なintが削除されました。
一部のコンパイラでは、.c
拡張は、C++ではなくCとしてコンパイルされます。
float d = 3.14f;
int i = 1;
auto sum = d + i;
次のようにコンパイルされます:
float d = 3.14f;
int i = 1;
int sum = d + i;
C言語では、auto
は保存期間を指定するためのキーワードです。 auto
変数を作成すると、「自動保存期間」が設定されます。これらのオブジェクトを「ローカル変数」と呼びます。 Cでは、関数内のすべての変数はデフォルトでローカルです。そのため、キーワードauto
はほとんど使用されません。
auto
キーワードは、C言語では役に立ちません。これは、C言語の前に、ローカル変数を宣言するためにそのキーワードが必要なB言語が存在したためです。 (BはNBに開発され、Cになりました。)