2016-07-11 7 views
2

次のコードではどのように多くの型変換があります。機能f()コードには何種類の型変換がありますか?

#include<stdio.h> 
int f(int x) 
{ 
    return (float)x; 
} 
int main() 
{ 
    float x = f(5L); 
    return 0; 
} 

は、戻り値はintからfloatに昇格されます。 main()では、f()の引数がintからlongに昇格され、intが再びfloatに昇格されます。

3種類のコンバージョン(プロモーション)があるのは間違いありませんか? f

+3

'x'は使用されないので、最適化されたコンパイルでは' float x = f(5L); 'がなくなり、ゼロ変換が行われます。それ以外は4+タイプの変更があります。 – chux

+0

コンバージョンのどれも「プロモーション」ではありません。 –

+0

'int'関数から値を返すために' int'を 'float'にキャストするのは何ですか? –

答えて

4

合計4つのタイプのコンバージョンがあります(いずれも「プロモーション」ではありません)。 f()インサイド

xの値が明示的にキャスト演算子によってintからfloatに変換され、その変換結果が暗黙的にreturn文によってfloatからintに変換されます。 main()インサイド

それはfへの引数として渡されたとき、一定の5Lの値は、暗黙的にintlong intから変換されます。 fへの呼び出しの結果は、の初期化によって暗黙的にintからfloatに変換されます。

これは4回のコンバージョンです。 (0はすでにmainの戻り値の型であるタイプint、のであるからreturn 0;は、変換を必要としない。)合理的に賢いコンパイラを考える

が、これらの変換のどれもがいずれかの非が発生しない可能性が高いです - トリビアル生成コード。値のいずれも使用されていないので、プログラム全体を

int main(void) { return 0; } 

相当に減少したが、4つのすべての変換は、Cの意味論によって定義された「抽象マシン」で発生することができます。

(ちなみに、int main(void)int main()に好適である。)

+0

long intからintへの変換は降格ですか? – user300046

+0

@display_error:あなたはそれを、それを呼びたいなら、確かに、私はしません。 C標準はその単語を使用しません。具体的には「*整数プロモーション*」という用語を定義しています([N1570](http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf)6.3.1.1を参照)。問題のコードには何もありません。 –

+0

@display_error:訂正:C標準では、J.2の浮動小数点変換を参照するために「降格」という語を使用していますが、非規範的な文章では非正規表現を使用しています。 –

2

int(引数) - >float(キャスト) - mainで>int(戻り値)

long(リテラル) - >int(引数)

int(fの戻り値) - >float(変数x)

これは4回のコンバージョンです。

0

この質問に対する単一の正解はありません - それはすべてのコンパイラおよび使用されるシステムに依存します。

良いコンパイラは、return 0;以外のすべてを介して行われ、変換はまったくありません。

コンパイラがまだ関数を保持していても、変換の回数は予測できません。 5Lintの変換はコンパイル時に解決されます。したがって、コンバージョンとしてカウントしないでください。また、多くのシステムでは、longintの両方に32ビット(多くのシステムで)があり、これは変換ではないことを示唆しているため、違いはありません。ほとんどのシステムで

int->float->intを引き起こし醜い(float)キャストはfloatintのすべての値を表すことができないように滞在する必要があります。しかし、すべてのintの値を表すことができる浮動小数点形式を使用している場合、コンパイラは変換によって離れている可能性があります。メインのint->floatは滞在する必要があります。

だから、0,1または3のいずれかの変換があります。最適化を使用してコンパイルすると、ほとんど0が発生します。

しかし本当の答えは - システムとコンパイラに依存します。

関連する問題