int i=9999;
char c=i;
オーバーフローの警告は出ませんが、
char c=9999;
与える、
警告 C4305 int から char への切り捨てを初期化しています
int
への変換時にオーバーフロー警告が表示されないのはなぜchar
ですか?
int i=9999;
char c=i;
オーバーフローの警告は出ませんが、
char c=9999;
与える、
警告 C4305 int から char への切り捨てを初期化しています
int
への変換時にオーバーフロー警告が表示されないのはなぜchar
ですか?
/W4 でコンパイルすると、警告 C4244が表示されます(これは常に実行する必要があります)。
警告 C4244: '初期化中': ' ' から '
int
' への変換char
、データが失われる可能性があります
コード構造が警告を生成するかどうかは、コンパイラの賢さとその作成者の選択次第です。
char c=9999;
9999
定数式です。コンパイラは、コンテキストを追加せずに宣言を分析するだけで、オーバーフローすることを判断できます。(おそらくプレーンchar
は署名されています。署名されていない場合、変換は明確に定義されていますが、コンパイラはそれについて警告することを選択できます。)
int i=9999;
char c=i;
これは同じセマンティクスを持ちますが、コンパイラが の初期化について警告するには、その宣言を分析するときにが値(または少なくとも の範囲外の値)c
を持っていることを知る必要があります。代わりに次のように書いたとします。i
9999
char
int i = 9999;
i = 42;
char c = i;
その場合、明らかに警告は必要または適切ではありません。
James McNellis の答えが示すように、十分に賢いコンパイラは、プログラムの実行中に何が起こるかについて追加の分析を実行する場合、どちらの場合についても警告することができます。一部のコンパイラでは、コードを (コードを壊さずに) 最適化するために必要な分析によって、この種の潜在的な実行時エラーが明らかになるため、最適化を有効にすると役立ちます。
これは、あなたが尋ねた質問に対する答えであることに注意してください。なぜ警告がないのですか。あなたが受け入れた答えは、 「ここで警告が必要です。どうすれば有効にできますか?」という暗黙の質問に対するものです。私は文句を言っているのではなく、ただ観察しているだけです。