NS>Вылазит ошибка, что проблема в макросе, где я ошибся?
в макросе нужно написать выражение. которые будет спокойно преобразовываться в int (аргумент функции Foo)
у вас нет такого выражения в макросе
там написано
if (x>0) x = 9;
у него нет целочисленного значения, это просто стейтменты
могу порекомендовать такое:
int Action(int& x)
{
return x > 0 ? x = 9 : x;
}
void Foo(int i);
int i = 4;
Foo(Action(i));
NS>>Вылазит ошибка, что проблема в макросе, где я ошибся? U>в макросе нужно написать выражение. которые будет спокойно преобразовываться в int (аргумент функции Foo) U>у вас нет такого выражения в макросе U>там написано U>
if (x>0) x = 9;
U>у него нет целочисленного значения, это просто стейтменты U>могу порекомендовать такое: U>
U>int Action(int& x)
U>{
U> return x > 0 ? x = 9 : x;
U>}
U>void Foo(int i);
U>int i = 4;
U>Foo(Action(i));
U>
Хотелось,конечно,без вызова функции обойтись, но придется скорее всего, спасибо
тут приоритеты неважны, присваивание будет сделано только в том случае, если x > 0 и приоритет = ни играет никакой роли
приоритеты играют в других случаях: http://codepad.org/uRVjVqpU
Здравствуйте, Centaur, Вы писали:
C>Здравствуйте, winston, Вы писали:
NS>>>Вылазит ошибка, что проблема в макросе, где я ошибся?
W>>#define ACTION(x) (x > 0 ? x = 9 : x)
C>Если писать макрос, то писать правильно:
C>
#define ACTION(x) ((x) > 0 ? (x) = 9 : (x))
И в чем тут правильность? Кроме переменной макрос все равно ничего не примет, так что скобками обрамлять не имеет смысла, мне кажется. Или Вы про что?
Здравствуйте, uzhas, Вы писали:
U>приоритеты играют в других случаях: U>http://codepad.org/uRVjVqpU
здесь я ошибся , неправильный пример, показывающий важность приоритетов
подтверждение: http://codepad.org/fFSPGTB7
здесь скорее всего играет жадный парсер
C>>inline
C>>int Action(int& x)
C>>{
C>> return x > 0 ? x = 9 : x;
C>>}
C>>
ЕП>Приоритет у тернарной операции выше, чем у присваивания.
У тернарного оператора приоритет и ассоциативность такие же, как и у оператора присваивания, причём применяются они только в отношении левого и правого операндов. В качестве среднего операнда может выступать выражение любой синтаксической формы (тут действуют только семантические ограничения).
Здравствуйте, winston, Вы писали:
W>Здравствуйте, Centaur, Вы писали:
C>>Здравствуйте, winston, Вы писали:
NS>>>>Вылазит ошибка, что проблема в макросе, где я ошибся?
W>>>#define ACTION(x) (x > 0 ? x = 9 : x)
C>>Если писать макрос, то писать правильно:
C>>
#define ACTION(x) ((x) > 0 ? (x) = 9 : (x))
W>И в чем тут правильность? Кроме переменной макрос все равно ничего не примет, так что скобками обрамлять не имеет смысла, мне кажется. Или Вы про что?
только в скобочки потому что в выражении где будет использоватся этот макрос тернарный оператор имеет мньший приоритет и трактуется иначе чем вызов функции по сути неделимой операции в отлчии от того же ?: которого если не взять в скобочки можно получить черти что вы хотите обманчивую семаентику ? вы будете видет вызов функции надеятся на семантику и поведение вызова функции а получите косяки тернарного оператора если все эито дело не взять в сакобочки насчет взять аргумекнт макроса в скобочки это только повысит наглядность не надо голову ломать в каких синтаксических конструкциях это приведет к багу если не взять например в чмстом си смысла брать нету в в си++ есть так аргуент сам может быть тернарный оператор к примеру результат которого используется как lvalue
конечно для чистого си брать в скобочки не имеет смысла там просто недопустим тернарный оператор как lvalue на чистого си имеет смысл взять в скобочки только все тело макроса
а вообще это бажный код какой то если полагается на это отличие в семантике лучше на сипипи так не писать ну всмысле не использовать результат тернарного как lvalue православный сишник этого не поймет и не сможет даже скомпилить
вот нафига было так менять поведение в сипипи ????? нельзя что ли было оставить как в си при переходе к сипипи думаеш знаеш семантику а потом спотыкаешся на такой фигне
тда и не только есть еще баги если ка сипипи компилить опять же если передать тернарный оператор то получится
((x) > 0 ? (x) = 9 : (x))
(a) ? (b) : ((c > 0) ? (a ? b : c = 9) : (a ? b : c))
что выражение вообще считатся не будет
а православный си не скомпилит споткнется не из за первого выражения а из за присваивания результату ?:
вывод в си ненадо брать в скобки это просто не скомпилится а в сипипи если не взять целых две ловушки получитя в разных местах
Здравствуйте, Masterkent, Вы писали:
M>winston:
W>>>>#define ACTION(x) (x > 0 ? x = 9 : x)
C>>>Если писать макрос, то писать правильно:
C>>>
#define ACTION(x) ((x) > 0 ? (x) = 9 : (x))
W>>И в чем тут правильность? Кроме переменной макрос все равно ничего не примет, так что скобками обрамлять не имеет смысла, мне кажется.
M>Попробуй на место x подставить выражение вида a ? b : c. В случае применения исходного варианта получится
M>
( a ? b : c > 0 ? a ? b : c = 9 : a ? b : c )
M>что эквивалентно
M>
( (a ? b : (c > 0)) ? a ? b : (c = 9) : (a ? b : c) )
неправда вашаъ
( a ? b : c > 0 ? a ? b : c = 9 : a ? b : c )
не эквивалентно
( (a ? b : (c > 0)) ? a ? b : (c = 9) : (a ? b : c) )
а эквивалентноъ
( (a) ? (b) : ((c > 0) ? (a ? b : c = 9) : (a ? b : c))
Здравствуйте, Masterkent, Вы писали:
M>Енот-полоскун:
C>>>
C>>>inline
C>>>int Action(int& x)
C>>>{
C>>> return x > 0 ? x = 9 : x;
C>>>}
C>>>
ЕП>>Приоритет у тернарной операции выше, чем у присваивания.
M>У тернарного оператора приоритет и ассоциативность такие же, как и у оператора присваивания, причём применяются они только в отношении левого и правого операндов. В качестве среднего операнда может выступать выражение любой синтаксической формы (тут действуют только семантические ограничения).
не такие же а у = ниже а у ?: выше иначе бы это работало не правильно
var += cond ? expr : expr;
если бы были такие же то условие было бы (var += cond) ? а реально только (cond)
а почему в третьем выражении присваивание входит в третье выражение читайте ниже
The binding of operators in C and C++ is specified (in the corresponding Standards) by a factored language grammar, rather than a precedence table. This creates some subtle conflicts. For example, in C, the syntax for a conditional expression is:
logical-OR-expression ? expression :
conditional-expression
while in C++ it is:
logical-or-expression ? expression :
assignment-expression
Hence, the expression:
e = a ? b : c = d
is parsed differently in the two languages. In C, this expression is parsed as:
e = ((a ? b : c) = d)
which is a semantic error, since the result of a conditional-expression is not an lvalue. In C++, it is parsed as:
e = (a ? b : (c = d))