Ниже описано, как стандарт (ISO 14882) объясняет прерывание -1> sizeof (int)
Реляционный оператор `> 'определен в 5.9 (expr.rel / 2)
Обычные арифметические преобразования выполняются над операндами арифметического или перечислимого типа....
Обычные арифметические преобразования определены в 5 (expr / 9)
... Шаблон называется обычными арифметическими преобразованиями, которые определены следующим образом:
- Если любой из операндов имеет тип long double, ...
- В противном случае, если любой из операндов является dobule, ...
- В противном случае, если любой из операндов является плавающим, ...
- В противном случае интегральные продвижения выполняются для обоих операндов.
- ...
Интегральные продвижения определены в 4.5 (конв.prom / 1)
r-значение типа char, знаковый char, unsigned char, short int или unsigned short int можно преобразовать в rvalue типа int, если int может представлять все значенияТип источника;в противном случае исходное значение r может быть преобразовано в значение типа unsigned int.
Результат sizeof определен в 5.3.3 (expr.sizeof / 6)
Результатом является константа типа size_t
size_t определена в стандарте C (ISO 9899), которая представляет собой целочисленный тип без знака .
Так что для -1 > sizeof(int)
,> запускает обычные арифметические преобразования.Обычное арифметическое преобразование преобразует -1 в беззнаковое целое, потому что int не может представлять все значения size_t
.-1
становится очень большим числом в зависимости от платформы.Так что -1 > sizeof(int)
это true
.