7

これはGoogleを介して簡単に解決できる質問だと思っていましたが、決定的な(または推測的な)答えを見つけることができないようです。

コンパレータステートメントを使用する場合、暗黙的なキャストはどの順序で発生しますか?

int i = -1;
size_t t = 1;

bool result = i < t;

これは次と同等ですか?

bool result = i < int(t);    // equals true

また:

bool result = size_t(i) < t;    // equals false

これは質問の簡単な部分です。2番目の部分は「一般的なルールは何ですか」です。

  1. 'simpler'引数は、常に'more complex'引数(つまり、size_t-> int)に変換されます。
  2. 最初の(または2番目の)引数は常に2番目の(または最初の)引数の型に変換されます。
  3. size_tやintなどの組み込みプリミティブには、ケースバイケースでキャストを指定する特定のコンパレータ演算子があります。

3つすべてが妥当なように見えますが、2つ目は、ほとんどの人が直感的に期待するものとは大幅に異なる動作をもたらします。

VC ++コンパイラは、intをsize_tと比較すると、レベル3の警告の価値があると考えているようですが、size_tを返す関数から負の数を返す場合にのみレベル4の警告が表示されます(結果として、返される最大整数の半分以上)。

レベル4の警告をすべて取り除くために、とにかくすべてを明示的にキャストしましたが、「真実」を知りたかったのです。これはどこかで定義する必要があります...


$ 18.2 / 6-型size_tは、実装で定義された符号なし整数 型であり、任意のオブジェクトのバイト単位のサイズを含めるのに十分な大きさです。

$ 5.9-それ以外の場合、符号なし整数型のオペランドのランクが他のオペランドの型のランク以上の場合、符号付き整数型のオペランドは符号なし整数型のオペランドの型に変換されます。最初の部分では、C ++標準で指定されているように変換する前に、boolがintにプロモートされます。

つまり、これは「i」が「size_t」の型に変換されることを意味します(size_tの型が「unsignedint」以上であると想定)。次に、タイプ'unsignedint'の結果が'bool'(タイプはresult)に変換されます。

標準では、ランクが同じであるsigned intと指定されていることに注意してくださいunsigned int

変換/プロモーションの正確なルールについては、C++標準のセクション4および5を参照してください。

4

2 に答える 2

10

ルールはかなり複雑で、実装によって異なります。ただし、基本的には次のようになります。

  1. どちらのタイプも「プロモート」されています。これは、よりも小さいものintはすべてに昇格されることを意味しintます。(まれに、size_tよりも小さい場合はint、署名付きに昇格され、署名intなしが失われます。)

  2. タイプの1つに他のすべての値を含めることができる場合、もう1つはこのタイプに変換されます。

  3. タイプの1つが符号なしで、もう1つが符号付きで、サイズが同じである場合、符号付きは符号なしに変換されます。

intおよびsize_t(符号なしである必要があります)の場合、これは、がより小さい場合を除いてsize_tintintに変換されることを意味しsize_tます。

于 2013-01-30T12:35:15.960 に答える
4

$18.2/6- size_t 型は実装定義の符号なし整数 型で、任意のオブジェクトのサイズをバイト単位で格納するのに十分な大きさです。

$5.9 - それ以外の場合、符号なし整数型のオペランドのランクが他のオペランドの型のランク以上の場合、符号付き整数型のオペランドは符号なし整数型のオペランドの型に変換されます。最初の部分では、C++ 標準で指定されている変換の前に、bool が int に昇格されます。

したがって、これは、「i」が「size_t」の型に変換されることを意味します (size_t が「unsigned int」以上の型であると仮定します)。次に、「unsigned int」型の結果が「bool」(の型result) に変換されます。

規格では、ランクsigned intunsigned int同じであると指定されていることに注意してください。

変換/昇格の正確な規則については、C++ 標準のセクション 4 および 5 を参照してください。

于 2013-01-30T12:27:04.830 に答える