ホームページ > バックエンド開発 > C++ > MSVC は、符号付き/符号なしの等価比較 (==) については警告しないのに、他の比較については警告するのはなぜですか?

MSVC は、符号付き/符号なしの等価比較 (==) については警告しないのに、他の比較については警告するのはなぜですか?

Patricia Arquette
リリース: 2024-12-21 00:14:16
オリジナル
693 人が閲覧しました

Why Doesn't MSVC Warn About Signed/Unsigned Equality Comparisons (==) But Warns About Other Comparisons?

MSVC の符号付き値と符号なし値の比較: 警告の不在を理解する

このコード スニペットでは、次の警告が存在しないことがわかります。具体的な比較:

int a = INT_MAX;
unsigned int b = UINT_MAX;
bool c = false;
...
if (a == b) // no warning
ログイン後にコピー

これはなぜなのかという疑問を引き起こします== を使用して比較した場合、符号付き値と符号なし値の比較では警告が表示されませんが、他の比較 (<、>、<=、>=) では警告が表示されます。

バックグラウンド プロモーションと C4018

この比較では、バックグラウンド プロモーションのために警告が生成されることが予想されました。ただし、最後の 2 つの例はこのロジックに反論しています。

if (((unsigned int)a) == b) // no warning
if (a == ((int)b)) // no warning
ログイン後にコピー

変換ルール

符号付き値と符号なし値を比較する場合、コンパイラは C 言語で概説されている特定の変換ルールに従います。標準。等価比較 (==) の場合、結果は常にブール値 (true または false) であるため、オペランドが符号付きであるか符号なしであるかは関係ありません。

ただし、他の比較では、符号付きの値が変換されます。無署名に。この変換は比較結果に影響を与えるため、重要です。たとえば、次のステートメントでは:

-1 > 2U
ログイン後にコピー

-1 が大きな正の符号なし整数に変換され、正しい比較が行われるため、結果は true になります。

MSVC 警告レベル

符号付き/符号なしの等価比較に対する警告を抑制するという MSVC の選択は、意図的なものです。開発者によると、== を使用して符号付き値と符号なし値を比較すると、直感的な結果が得られることがよくあります。たとえば、-1 == -1 は、符号付きか符号なしかに関係なく true となります。

一方、符号付き/符号なしに関する大なり (>) または小なり (

以上がMSVC は、符号付き/符号なしの等価比較 (==) については警告しないのに、他の比較については警告するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート