Унарный + оператор выполняет преобразования типов?

До сих пор я верил, что унар + оператор.

Но потом я наткнулся на следующий пример:

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Унарный + сам. Операнды одинарных + пройти "обычные арифметические преобразования". Смотрите, например, этот другой ответ, включающий обычное сложение.

Другие вопросы по тегам