В C допустимо написать что-то вроде:
int foo = +4;
Однако, насколько я могу судить, унарный плюс (+
) в +4
не работает. Это?
В C допустимо написать что-то вроде:
int foo = +4;
Однако, насколько я могу судить, унарный плюс (+
) в +4
не работает. Это?
Согласно стандарту C90 в 6.3.3.3:
Результатом унарного оператора + является значение его операнда. Интегральное продвижение выполняется над операндом. и результат имеет продвигаемый тип.
и
Операнд унарного оператора + или - должен иметь арифметический тип..
+x
- это noop, если только sizeof x < sizeof(int)
?
- person zneak; 09.07.2011
sizeof(short) == sizeof(int)
, но short
имеет заполнение, и теоретически в такой системе заполнение может потребовать обнуления или расширения знака. Теоретически.
- person Dietrich Epp; 09.07.2011
float
или double
, не так ли?
- person S.S. Anne; 14.01.2020
Вы можете использовать его как своего рода утверждение, что выражение имеет арифметический тип:
#define CHECK_ARITHMETIC(x) (+(x))
Это вызовет ошибку времени компиляции, если x
оценивается (скажем) как указатель.
Это единственное практическое применение, которое я могу придумать.
(-(-(x)))
?
- person Aaron Yodaiken; 10.07.2011
int
является 32-битным, а x
оказывается int
равным -2^31
, то -x
переполняет целое число со знаком, что технически является неопределенным поведением. :-)
- person Nemo; 10.07.2011
CHECK_ARITHMETIC
не используется ни в каком присваивании, меня это устраивает :)
- person zneak; 10.07.2011
INT_MIN
. (Ну, во всяком случае, в теории. На практике это, вероятно, работает нормально на любой реалистичной машине.) Тем не менее, строгое прочтение стандарта говорит, что они разные.
- person Nemo; 10.07.2011
CHECK_ARITHMETIC(x);
, не используя его в задании, чтобы получить ошибку компиляции, и использовать x
сразу после этого.
- person zneak; 10.07.2011
-x
, когда x
равно INT_MIN
, технически вызвать неопределенное поведение.
- person Nemo; 10.07.2011
#define CHECK_ARITHMETIC(x) (-(x))
. Унарный + был добавлен в стандарт ANSI только для симметрии с унарным -.
- person Priyank Bhatnagar; 10.07.2011
(+(x))
, чтобы утверждать, что выражение имеет арифметический тип во время компиляции. Вместо этого вы не можете использовать (-(x))
или (-(-(x)))
, не рискуя неопределённым поведением. Не то чтобы это было особенно полезно... И я не утверждаю, что это было обоснованием... Но насколько мне известно, это единственный способ сделать это.
- person Nemo; 11.07.2011
-
для утверждения арифметического типа, если вы не вычисляете выражение. Например, (0&&-(x))
. Если вы хотите убедиться, что x
все еще оценивается, используйте ((x),(0&&-(x)))
.
- person R.. GitHub STOP HELPING ICE; 28.09.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
FOO
выражение будет недействительным C.
- person zneak; 10.07.2011
#ifndef FOO\n#define FOO 0\n#endif\n#if FOO > 0\n
работает.
- person Aaron Yodaiken; 10.07.2011
#define FOO
#ifndef FOO
ложно. Неопределенные имена уже заменены на 0 в #if
, поэтому ваш фрагмент кода бесполезен. Пустые определения сильно отличаются от неопределенных и распространены из-за таких вещей, как -DFOO
.
- person R.. GitHub STOP HELPING ICE; 10.07.2011
- -
(требуется пробел!) эквивалентна +
, насколько я могу судить, что делает +
довольно избыточным... Нет, это неправильно, это не эквивалентно, когда операнд INT_MIN
... :- )
- person R.. GitHub STOP HELPING ICE; 10.07.2011
#ifdef FOO
, да.
- person R.. GitHub STOP HELPING ICE; 10.07.2011
+
может быть унарным или бинарным оператором, определяемым контекстом использования, если у вас есть два операнда, это не унарное использование. Унарные имеют только один операнд.
- person Undefined Behavior; 07.02.2019
FOO
.
- person R.. GitHub STOP HELPING ICE; 07.02.2019
Довольно много. Он в основном присутствует для полноты и для того, чтобы подобные конструкции выглядели немного чище:
int arr[] = {
+4,
-1,
+1,
-4,
};
+
s.
- person ruohola; 13.06.2019
Я обнаружил две вещи, которые делает унарный оператор +
:
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
sizeof(int)
. Я понятия не имею, когда я буду его использовать. Но приятно все равно. NB: отредактированный ответ, чтобы показать, что не все идет к 4.
- person Persixty; 07.09.2017
Унарный оператор +
делает только одну вещь: применяет целочисленные повышения. Поскольку это произошло бы в любом случае, если бы операнд использовался в выражении, можно представить, что унарный +
находится в C просто для симметрии с унарным -
.
Трудно увидеть это в действии, потому что рекламные акции применяются повсеместно.
Я придумал это:
printf("%zd\n", sizeof( (char) 'x'));
printf("%zd\n", sizeof(+(char) 'x'));
который (на моем Mac) печатает
1
4
char
в C++ с std::cout
.
- person S.S. Anne; 14.01.2020
Какова цель унарного оператора «+» в C?
Унарный плюс был добавлен к C для симметрии с унарным минусом из Обоснование международного стандарта — Языки программирования — C:
Унарный плюс был принят Комитетом C89 из нескольких реализаций для симметрии с унарным минусом.
и это не операция, она выполняет целочисленное продвижение своего операнда. Цитата из моего ответа на Выполняет ли оператор Unary + преобразование типов?:
В черновом разделе стандарта C99 6.5.3.3
Унарные арифметические операторы говорится:
Результатом унарного оператора + является значение его (расширенного) операнда. На операнде выполняется целочисленное повышение, и результат имеет повышенный тип.
Стоит отметить, что Справочное руководство по C++ с примечаниями (ARM) предоставляет следующие комментарий к унарному плюсу:
Унарный плюс — историческая случайность и вообще бесполезный.
static_cast
более четко показывает намерение, например Разрешение неоднозначной перегрузки указателя функции и std::function для лямбда используя +
- person Shafik Yaghmour; 30.11.2017
Под «не-оперативкой» вы имеете в виду инструкцию по сборке?
Если да, то точно нет.
+4 равно 4 — компилятор не будет добавлять никаких дополнительных инструкций.
+(char)4
не то же самое, что (char)4
.
- person DigitalRoss; 11.07.2011
+short(1)
имеет типint
, а неshort
. - person MSalters   schedule 11.07.2011+
, заставляют группироваться. - person Keith Thompson   schedule 01.07.2013+short(1)
- синтаксическая ошибка. Вы думали о+(short)1
? - person Keith Thompson   schedule 01.07.2013