Какова цель унарного оператора '+' в 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 - компилятор не будет добавлять дальнейшие инструкции.

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