Какова цель унарного оператора '+' в C?
В С законно написать что-то вроде:
int foo = +4;
Однако, насколько я могу судить, одинарный +
в +4
это неоперация. Это?
8 ответов
Согласно стандарту C90 в 6.3.3.3:
Результатом унарного оператора + является значение его операнда. Интегральное продвижение выполняется на операнде. и результат имеет повышенный тип.
а также
Операнд унарного оператора + или - должен иметь арифметический тип.
Вы можете использовать это как своего рода утверждение, что выражение имеет арифметический тип:
#define CHECK_ARITHMETIC(x) (+(x))
Это сгенерирует ошибку во время компиляции, если x
оценивает (скажем) указатель.
Это о единственном практическом использовании, о котором я могу думать.
Я знаю одно очень удобное использование унарного оператора плюс: в макросах. Предположим, вы хотите сделать что-то вроде
#if FOO > 0
Если FOO
не определено, язык C требует, чтобы он был заменен на 0 в этом случае. Но если FOO
был определен с пустым определением, приведенная выше директива приведет к ошибке. Вместо этого вы можете использовать:
#if FOO+0 > 0
И теперь директива будет синтаксически правильной FOO
не определено, определено как пустое или определено как целочисленное значение.
Конечно, даст ли это желаемую семантику - это совершенно отдельный вопрос, но в некоторых полезных случаях это будет.
Изменить: Обратите внимание, что вы даже можете использовать это, чтобы различать случаи FOO
определяется как ноль, а не как пустой, как в:
#if 2*FOO+1 == 1
/* FOO is 0 */
#else
/* FOO is blank */
#endif
Я нашел две вещи, которые одинарные +
оператор делает это
integer promotion
turning lvalue into rvalue
пример целочисленного продвижения:
#include <stdio.h>
int main(void) {
char ch;
short sh;
int i;
long l;
printf("%d %d %d %d\n",sizeof(ch),sizeof(sh),sizeof(i),sizeof(l));
printf("%d %d %d %d\n",sizeof(+ch),sizeof(+sh),sizeof(+i),sizeof(+l));
return 0;
}
Типичный вывод (на 64-битной платформе):
1 2 4 8
4 4 4 8
превращение lvalue в пример rvalue:
int i=0,j;
j=(+i)++; // error lvalue required
Довольно много. Это в основном присутствует для полноты, и чтобы конструкции выглядели немного чище:
int arr[] = {
+4,
-1,
+1,
-4,
};
Не совсем неоперативный
Одинарный +
Оператор делает только одно: он применяет целочисленные акции. Так как это произойдет в любом случае, если операнд будет использоваться в выражении, можно представить, что унарный +
в C просто для симметрии с одинарным -
,
Трудно увидеть это в действии, потому что рекламные акции так широко применяются.
Я придумал это:
printf("%zd\n", sizeof( (char) 'x'));
printf("%zd\n", sizeof(+(char) 'x'));
который (на моем Mac) печатает
1
4
Какова цель унарного оператора '+' в C?
Унарный плюс был добавлен в C для симметрии с унарным минусом из Обоснования международного стандарта - Языки программирования - C:
Унарный плюс был принят Комитетом C89 из нескольких реализаций, для симметрии с унарным минусом.
и это не запрет, он выполняет целочисленные преобразования своего операнда. Цитата из моего ответа на оператор Unary + выполняет преобразования типов?:
Проект стандартного раздела C99 6.5.3.3
Унарные арифметические операторы говорят:
Результатом унарного оператора + является значение его (повышенного) операнда. Целочисленные продвижения выполняются над операндом, и результат имеет продвинутый тип.
Стоит отметить, что Annotated C++ Reference Manual (ARM) предоставляет следующий комментарий к унарному плюсу:
Унарный плюс это историческая случайность и вообще бесполезная.
Под "no-op" вы подразумеваете инструкцию по сборке?
Если так, то определенно нет.
+4 - это всего лишь 4 - компилятор не будет добавлять дальнейшие инструкции.