Какова цель унарного оператора '+' в C? - PullRequest
74 голосов
/ 09 июля 2011

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

int foo = +4;

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

Ответы [ 8 ]

75 голосов
/ 09 июля 2011

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

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

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

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

34 голосов
/ 10 июля 2011

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

#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
32 голосов
/ 09 июля 2011

Согласно стандарту C90 в 6.3.3.3:

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

и

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

18 голосов
/ 09 июля 2011

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

int arr[] = {
    +4,
    -1,
    +1,
    -4,
};
13 голосов
/ 11 июля 2011

Не совсем безоперационный

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

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

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

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

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

1
4
12 голосов
/ 11 июня 2015

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

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

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

и это ненет, он выполняет целочисленные преобразования своего операнда.Цитата из моего ответа на Делает ли оператор Unary + преобразования типов? :

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

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

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

Унарный плюс - историческая случайность и, как правило, бесполезный.

11 голосов
/ 18 июля 2014

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

  • 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
2 голосов
/ 10 июля 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...