Унарный + оператор выполняет преобразования типов?
До сих пор я верил, что унар +
оператор.
Но потом я наткнулся на следующий пример:
char ch;
short sh;
int i;
printf("%d %d %d",sizeof(ch),sizeof(sh),sizeof(i)); // output: 1 2 4
printf("%d %d %d",sizeof(+ch),sizeof(+sh),sizeof(i)); // output: 4 4 4
Значит ли это +
здесь выполняется преобразование типов?
Потому что он ведет себя так же, как следующий
printf("%d %d %d",sizeof((int)ch),sizeof((int)sh),sizeof(i)); // output: 4 4 4
Это заставляет меня думать +
делает преобразование типов.
Но потом я примеряю double
double f;
printf("%d %d",sizeof(+f),sizeof((int)f),sizeof(f)); // output: 8 4 8
Это заставляет меня переосмыслить +
оператор.
Итак, мой второй вопрос: один ли +
Оператор имеет особый эффект в sizeof
оператор?
4 ответа
Unary + выполняет целочисленные преобразования своего операнда, это можно увидеть, перейдя к черновому стандартному разделу C99 6.5.3.3
Унарные арифметические операторы, которые говорят (выделение мое в будущем):
Результатом унарного оператора + является значение его (повышенного) операнда. Целочисленные продвижения выполняются над операндом, и результат имеет продвинутый тип.
и раздел 6.3.1
Арифметические операнды говорят:
Если int может представлять все значения исходного типа, значение преобразуется в int; в противном случае он конвертируется в беззнаковое целое. Они называются целочисленными акциями.48) Все остальные типы не изменяются целочисленными акциями.
Обратите внимание, что все другие типы не изменяются целочисленными промоушенами, и, следовательно, double - двойной. Это также будет распространяться и на float, который не будет удвоен.
Также обратите внимание, что с помощью %d
за результат sizeof
является неопределенным поведением, так как результатом является size_t. правильный спецификатор формата будет %zu
,
Когда меньшие типы участвуют в выражении с большими типами (например, char
меньше чем short
который в основном меньше, чем int
который может быть меньше, чем long
), участвующие типы повышаются до более крупных.
Так что да, когда вы используете одинарный +
оператор, вы получите int
, так как int
натуральный целочисленный тип в C.
Учитывая double
тип, естественный тип с плавающей точкой для C double
Вот почему нет продвижения по значениям или переменным, которые уже имеют тип double
,
sizeof
оператор не имеет к этому никакого отношения.
Оператор одинарный +
запускает "начальные" обычные арифметические преобразования, поэтому все целочисленные операнды, тип которых имеет ранг ниже, чем ранг int
а также unsigned int
повышены до int
(или же unsigned int
если int
Тип не охватывает все значения типа, продвигаемого в этой реализации).
Это не sizeof
Унарный +
сам. Операнды одинарных +
пройти "обычные арифметические преобразования". Смотрите, например, этот другой ответ, включающий обычное сложение.