|
тернарный оператор |
|
|
|
Oct 8 2013, 08:19
|
Гуру
     
Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493

|
int test=2, a = 55, b = 22; (test==1) ? a = 1 : b = 2; printf("%d %d\n", a,  ; В голоМ С некорректна (С99) тоже, как я понимаю вопрос приоритетов (они в одной строчке) Но в С++ проходит без единой запинки, да еще и выдает вполне ожидаемые результаты. Это что за сюрприз на старости лет ? Похоже тут отличие присвоения от иницииализации. Хорошая тема валить на собеседовании
|
|
|
|
|
 |
Ответов
(1 - 14)
|
Oct 8 2013, 09:17
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
QUOTE (DASM @ Oct 8 2013, 11:58)  Каков результат ? C++ - "1 22", C - error: lvalue required as left operand of assignment, причем на b = 2. a = 1 кушает и выполняет. Не понимаю. QUOTE (ViKo @ Oct 8 2013, 12:06)  У оператора присваивания ( = ) приоритет ниже, чем у тернарного ( ? : ). - В скобки его! А... точно. А в плюсах у них одинаковый приоритет, поэтому они группируются согласно правилам этого приоритета, т.е. справа налево.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Oct 8 2013, 10:03
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
QUOTE (DASM @ Oct 8 2013, 12:38)  Я думаю тут вопрос не в приоритете, а в том, что С++ трактует это не как присваивание, а как начальныю инициализацию, что-то в этом роде Почему? В С приоритеты разные, поэтому выражение рассматривается как ((test==1) ? a = 1 : b ) = 2; что абсурдно. В С++ приоритет одинаковый и для этого приоритета подвыражения группируются справа налево, т.е. получается (test==1) ? a = 1 : (b = 2);
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Oct 8 2013, 10:52
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
QUOTE (DASM @ Oct 8 2013, 13:37)  не нашел ссылки про разность приоритетов Я просто гуглил " C operator precedence" и " C++ operator precedence"
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Oct 9 2013, 06:34
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата(Genadi Zawidowski @ Oct 9 2013, 01:03)  Я бы ваши примеры слегка упростил, добавил симметрии и сделал чтобы они собирались. Так ИМХО гораздо интереснее и вернее т.к. n является аргументом функции и не меняется предыдущими тестами. Можно также понаблюдать результаты тестов 2 и 3, при изменении уровня оптимизации... Код #include <stdio.h> #include <stdlib.h>
int test0(int n) { return (n > 0) ? n , 33 : n; // 33 Okay } int test1(int n) { return (n > 0) ? n : n, 33; // 33 Okay }
int test2(int n) { return (n > 0) ? (n=0) : (n=33); // ??? and Error if missing () } int test3(int n) { return (n > 0) ? (n=33) : (n=0); // ??? and Error if missing () }
int main(void) {
printf("test0 = %d\n", test0(1)); printf("test1 = %d\n", test1(1)); printf("test2 = %d\n", test2(1)); printf("test3 = %d\n", test3(1));
return 0; }
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|