оператор возврата в тернарном операторе с ++ - PullRequest
31 голосов
/ 12 октября 2010

Я написал абсолютную функцию, используя троичный оператор, следующим образом

int abs(int a) {
 a >=0 ? return a : return -a;
}

Я получаю следующие сообщения об ошибках

../src/templates.cpp: In function ‘int abs(int)’:
../src/templates.cpp:4: error: expected primary-expression before ‘return’
../src/templates.cpp:4: error: expected ‘:’ before ‘return’
../src/templates.cpp:4: error: expected primary-expression before ‘return’
../src/templates.cpp:4: error: expected ‘;’ before ‘return’
../src/templates.cpp:4: error: expected primary-expression before ‘:’ token
../src/templates.cpp:4: error: expected ‘;’ before ‘:’ token
../src/templates.cpp:5: warning: no return statement in function returning non-void

Если я напишу так

return a>=0 ? a : -a;

Я не получаю никакой ошибки.Какая разница между этими двумя?

Ответы [ 5 ]

41 голосов
/ 12 октября 2010

Вторым и третьим аргументами троичного оператора являются выражения, а не выражения.

 return a

это утверждение

33 голосов
/ 13 октября 2010

Ваш синтаксис неверен. Должно быть

if (a >=0)
    return a;
else
    return -a;

или как вы хотели:

return a >=0 ? a : -a;
23 голосов
/ 13 октября 2010

В чем разница между двумя?

Один правильный синтаксис, другой нет.

8 голосов
/ 12 октября 2010

?: - это оператор, который берет три выражения и каким-то образом оценивает их для получения результата.return a - это не выражение (это выражение ), поэтому ваша первая форма не работает.Это то же самое, что вы не можете поместить return в аргументы других операторов: return a + return b также не будет работать.

Если вы хотите получить возврат в отдельных ветвях, используйте if вместо:1012 *

if (a >=0)
   return a;
else
   return -a;
7 голосов
/ 12 октября 2010

Return является оператором и не может использоваться там, где ожидается значение.

Вы должны использовать выражения (которые обычно дают значение) в трех компонентах троичного оператора.

...