[解決済み] なぜ printf("%f",0); は未定義の動作をするのですか?
質問
文の内容
printf("%f\n",0.0f);
は0を表示します。
しかし、この文は
printf("%f\n",0);
はランダムな値を表示します。
何らかの未定義の動作を示していることは分かっているのですが、具体的な理由が分かりません。
すべてのビットが 0 である浮動小数点値は、まだ有効な
float
であり、値は 0 です。
float
そして
int
は私のマシンでは同じサイズです (それが関連するかどうかは別として)。
で浮動小数点リテラルの代わりに整数リテラルを使用するのはなぜですか?
printf
で整数リテラルを使用すると、このような動作になるのでしょうか?
追伸:同じ動作は、私が使用する場合、見ることができます
int i = 0;
printf("%f\n", i);
どのように解決するのですか?
この
"%f"
形式では、引数として
double
. 型の引数を与えています。
int
. そのため、動作が未定義になっています。
規格は、all-bits-zeroが有効な表現であることを保証していません。
0.0
(の有効な表現であることを保証するものではなく、また、任意の
double
の値、あるいは
int
と
double
は同じ大きさです(これは
double
ではなく
float
でない)、あるいは、たとえ同じサイズであっても、それらが同じ方法で変量関数に引数として渡されることです。
あなたのシステムで "work"することが起こるかもしれません。それは、エラーの診断を困難にするため、未定義の動作の最悪の症状です。
N1570 7.21.6.1項 9:
... もし,いずれかの引数が,対応する 変換指定に対して正しい型でない場合,その動作は未定義である。
型の引数
float
は
double
に昇格し、そのため
printf("%f\n",0.0f)
は動作します。よりも狭い整数の型の引数は
int
に昇格します。
int
または
unsigned int
. これらのプロモーション・ルール(N1570 6.5.2.2 paragraph 6で規定)は、以下の場合には役に立ちません。
printf("%f\n", 0)
.
もし、定数
0
を期待する非変数関数に渡すと
double
の引数を期待する非変数型関数の場合、関数のプロトタイプが見えると仮定すると、動作はよく定義されています。例えば
sqrt(0)
(の後に
#include <math.h>
の後) は、暗黙のうちに引数
0
から
int
から
double
-- の宣言から、コンパイラは
sqrt
を期待していることがわかるからです。
double
引数を期待することを示します。に対してはそのような情報はありません。
printf
. のような可変個体関数は
printf
のような変数は特殊で、呼び出しを記述する際にはより注意が必要です。
関連
-
[解決済み] gdbを使用してもデバッグシンボルが見つからない
-
[解決済み] explicit キーワードの意味は?
-
[解決済み] using namespace std;」はなぜバッドプラクティスだと言われるのですか?
-
[解決済み] printf/String.Formatに相当するJavaScriptの機能
-
[解決済み] C言語では「?」演算子は何をするのですか?
-
[解決済み] 未定義の動作とシーケンスポイント
-
[解決済み] printfは、フォーマット文字列の中に改行がないと、呼び出し後にフラッシュしないのはなぜですか?
-
[解決済み] 未定義、未指定、および実装で定義された動作
-
[解決済み】なぜこれらのコンストラクトはプリインクリメントとポストインクリメントを使用して未定義の動作をしているのでしょうか?
-
[解決済み】f(i = -1, i = -1)の挙動が未定義なのはなぜ?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】クラステンプレートの引数リストがない
-
[解決済み】浮動小数点例外エラーが発生する: 8
-
[解決済み】エラー。switchステートメントでcaseラベルにジャンプする
-
[解決済み】オブジェクト引数のない非静的メンバ関数の呼び出し コンパイラーエラー
-
[解決済み】#include<iostream>は存在するのですが、「識別子 "cout "は未定義です」というエラーが出ます。なぜですか?
-
[解決済み】C++の余分な資格エラー
-
[解決済み] 非静的データメンバの無効な使用
-
[解決済み] 数値定数の前にunqualified-idを付けて、数値を定義することを期待する。
-
[解決済み】VC++の致命的なエラーLNK1168:書き込みのためにfilename.exeを開くことができません。
-
[解決済み】'std::cout'への未定義の参照