В C, законно написать что-то вроде:
int foo = +4;
Однако, насколько я могу судить, унарный +
in +4
является no-op. Это?
В C, законно написать что-то вроде:
int foo = +4;
Однако, насколько я могу судить, унарный +
in +4
является no-op. Это?
В соответствии со стандартом C90 в 6.3.3.3:
Результатом унарного + оператора является значение его операнда. Интеграция выполняется на операнде. и результат имеет продвинутый тип.
и
Операнд унарного + или - оператора должен иметь арифметический тип.
Вы можете использовать его как своего рода утверждение о том, что выражение имеет арифметический тип:
#define CHECK_ARITHMETIC(x) (+(x))
Это приведет к генерации ошибки времени компиляции, если x
оценивает (скажем) указатель.
Это о единственном практическом использовании, о котором я могу думать.
Там одно очень удобное использование унарного оператора слияния, о котором я знаю: в макросах. Предположим, вы хотите сделать что-то вроде
#if FOO > 0
Если FOO
- undefined, язык C требует, чтобы в этом случае он был заменен на 0. Но если FOO
было определено с пустым определением, указанная выше директива приведет к ошибке. Вместо этого вы можете использовать:
#if FOO+0 > 0
И теперь директива будет синтаксически корректной, будет ли FOO
undefined, задан как пустой или определен как целочисленное значение.
Конечно, будет ли это давать требуемую семантику, это совершенно отдельный вопрос, но в некоторых полезных случаях это будет.
Изменить: Обратите внимание, что вы можете даже использовать это для различать случаи FOO
, определяемые как нулевые или заданные как пустые, например:
#if 2*FOO+1 == 1
/* FOO is 0 */
#else
/* FOO is blank */
#endif
В значительной степени. Он в основном присутствует для полноты, и сделать такие конструкции выглядят немного чище:
int arr[] = {
+4,
-1,
+1,
-4,
};
Унарный оператор +
выполняет только одно: он применяет целочисленные рекламные акции. Так как это происходило бы в любом случае, если бы операнд использовался в выражении, можно предположить, что унарный +
находится в C просто для симметрии с унарным -
.
Сложно видеть это в действии, потому что акции обычно применяются.
Я придумал это:
printf("%zd\n", sizeof( (char) 'x'));
printf("%zd\n", sizeof(+(char) 'x'));
который (на моем Mac) печатает
1
4
Я нашел две вещи, которые делает унарный оператор +
:
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
Какова цель унарного оператора "+" в C?
Унарный плюс был добавлен в C для симметрии с унарным минусом, из Обоснования для международных языков стандартного программирования-C:
Унарный плюс был принят Комитетом C89 из нескольких реализаций, для симметрии с унарным минусом.
и он не является no-op, он выполняет целые акции в своем операнде. Цитата из моего ответа на ли оператор Unary + тип преобразования? :
Проект стандартного раздела C99 6.5.3.3
Унарные арифметические операторы говорят:
Результатом унарного + оператора является значение его (продвинутого) операнда. Целые рекламные акции выполняются в операнде, и результат имеет продвинутый тип.
Стоит отметить, что в аннотированном справочном руководстве C++ (ARM) представлен следующий комментарий к унарному плюсу:
Унарный плюс является исторической катастрофой и вообще бесполезен.
Под "no-op", вы имеете в виду инструкцию по сборке?
Если да, то определенно не.
+4 всего 4 - компилятор не добавит никаких дальнейших инструкций.