Какова цель унарного оператора "+" в C?

В C, законно написать что-то вроде:

int foo = +4;

Однако, насколько я могу судить, унарный + in +4 является no-op. Это?

Ответ 1

В соответствии со стандартом C90 в 6.3.3.3:

Результатом унарного + оператора является значение его операнда. Интеграция выполняется на операнде. и результат имеет продвинутый тип.

и

Операнд унарного + или - оператора должен иметь арифметический тип.

Ответ 2

Вы можете использовать его как своего рода утверждение о том, что выражение имеет арифметический тип:

#define CHECK_ARITHMETIC(x) (+(x))

Это приведет к генерации ошибки времени компиляции, если x оценивает (скажем) указатель.

Это о единственном практическом использовании, о котором я могу думать.

Ответ 3

Там одно очень удобное использование унарного оператора слияния, о котором я знаю: в макросах. Предположим, вы хотите сделать что-то вроде

#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

Ответ 4

В значительной степени. Он в основном присутствует для полноты, и сделать такие конструкции выглядят немного чище:

int arr[] = {
    +4,
    -1,
    +1,
    -4,
};

Ответ 5

Не точно no-op

Унарный оператор + выполняет только одно: он применяет целочисленные рекламные акции. Так как это происходило бы в любом случае, если бы операнд использовался в выражении, можно предположить, что унарный + находится в C просто для симметрии с унарным -.

Сложно видеть это в действии, потому что акции обычно применяются.

Я придумал это:

printf("%zd\n", sizeof( (char) 'x'));
printf("%zd\n", sizeof(+(char) 'x'));

который (на моем Mac) печатает

1
4

Ответ 6

Я нашел две вещи, которые делает унарный оператор +:

  • 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

Ответ 7

Какова цель унарного оператора "+" в C?

Унарный плюс был добавлен в C для симметрии с унарным минусом, из Обоснования для международных языков стандартного программирования-C:

Унарный плюс был принят Комитетом C89 из нескольких реализаций, для симметрии с унарным минусом.

и он не является no-op, он выполняет целые акции в своем операнде. Цитата из моего ответа на ли оператор Unary + тип преобразования? :

Проект стандартного раздела C99 6.5.3.3 Унарные арифметические операторы говорят:

Результатом унарного + оператора является значение его (продвинутого) операнда. Целые рекламные акции выполняются в операнде, и результат имеет продвинутый тип.

Стоит отметить, что в аннотированном справочном руководстве C++ (ARM) представлен следующий комментарий к унарному плюсу:

Унарный плюс является исторической катастрофой и вообще бесполезен.

Ответ 8

Под "no-op", вы имеете в виду инструкцию по сборке?
Если да, то определенно не.

+4 всего 4 - компилятор не добавит никаких дальнейших инструкций.