В 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
s в C++ с std::cout
.
- person S.S. Anne; 14.01.2020
Каква е целта на унарния оператор "+" в C?
Унарен плюс беше добавен към C за симетрия с унарен минус от Обосновка за международен стандарт—Езици за програмиране—C:
Унарен плюс беше приет от комитета C89 от няколко реализации за симетрия с унарен минус.
и не е no-op, той изпълнява целочислените промоции на своя операнд. Цитирам от моя отговор на Операторът Unary + извършва ли преобразувания на типове?:
Проектът на стандартния раздел C99 6.5.3.3
Унарни аритметични оператори казва:
Резултатът от унарния + оператор е стойността на неговия (повишен) операнд. Цялочислените повишения се извършват върху операнда и резултатът има повишения тип.
Струва си да се отбележи, че Анотираното C++ справочно ръководство (ARM) предоставя следното коментар за унарен плюс:
Унарен плюс е историческа случайност и като цяло безполезен.
static_cast
показва намерението по-ясно, например Разрешаване на двусмислено претоварване на указател на функция и std::функция за ламбда използвайки +
- person Shafik Yaghmour; 30.11.2017
Под „no-op“ имате предвид инструкцията за сглобяване?
Ако е така, определено не.
+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