ホームページ  >  記事  >  バックエンド開発  >  C のオーバーロードされた関数に負の整数値の最大値を渡すと、値を直接出力すると正しく動作するにもかかわらず、あいまいさエラーが発生するのはなぜですか?

C のオーバーロードされた関数に負の整数値の最大値を渡すと、値を直接出力すると正しく動作するにもかかわらず、あいまいさエラーが発生するのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-10-31 21:24:02788ブラウズ

Why does passing the most negative integer value to an overloaded function in C   lead to an ambiguity error, even though printing the value directly works correctly?

最も負の整数値に対するあいまいな関数のオーバーロード

C では、関数のオーバーロードにより、名前は同じだがパラメーターが異なる複数の関数が許可されます。ただし、コンパイラが、指定された引数に基づいてどのオーバーロードされた関数を呼び出すかを決定できない場合、あいまいさが生じます。この問題は、整数型を扱うとき、特に最も負の値を扱うときに発生する可能性があります。

次のコード スニペットを考えてみましょう:

<code class="c++">void display(int a)
{
    cout << "int" << endl;
}

void display(unsigned a)
{
    cout << "unsigned" << endl;
}

int main()
{
    int i = -2147483648;
    cout << i << endl; //will display -2147483648
    display(-2147483648);
}</code>

関数のオーバーロードに関する理解によれば、任意の値整数範囲内 (この場合は 4 バイト) は、display(int) 関数を呼び出す必要があります。この範囲外の値を指定すると、あいまいさが生じます。ただし、このコードをコンパイルすると、次のエラーが発生します。

call of overloaded `display(long int)` is ambiguous

このエラーは、最大の負の整数値 (-2147483648) を表示関数に渡すときに発生します。奇妙なことに、同じ値を直接出力すると (6 行目に見られるように) 正しい結果が生成されます: -2147483648。この動作を理解する鍵は、 C に負のリテラルが存在しないことにあります。 C のすべての整数リテラルは、デフォルトでは符号なしとみなされます。つまり、符号プレフィックス (- または ) がありません。その結果、-2147483648 は実際には -1 * (2147483648) として扱われます。

オーバーロードされた関数の影響

2147483648 は整数の範囲 (4 バイト) を超えているため、 )、長整数に昇格されます。これは、コンパイラが既存の display(int) オーバーロードと競合する display(long int) 関数を呼び出そうとしていることを意味します。したがって、あいまいさが生じます。

解像度

このあいまいさを回避するには、 std::numeric_limits クラスを使用して型固有の最小値と最大値を取得することをお勧めします。 :

以上がC のオーバーロードされた関数に負の整数値の最大値を渡すと、値を直接出力すると正しく動作するにもかかわらず、あいまいさエラーが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。