реклама на сайте
подробности

 
 
> тернарный оператор
DASM
сообщение Oct 8 2013, 08:19
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 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, cool.gif;
В голоМ С некорректна (С99) тоже, как я понимаю вопрос приоритетов (они в одной строчке)
Но в С++ проходит без единой запинки, да еще и выдает вполне ожидаемые результаты. Это что за сюрприз на старости лет ?



Похоже тут отличие присвоения от иницииализации. Хорошая тема валить на собеседовании
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Genadi Zawidowsk...
сообщение Oct 8 2013, 21:03
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Может, немного прояснит один из тестовых файлов для C-компилятора.
На неоднозначность результата тут тестов нет, только на приоритеты.
Код
void    func1(void), func2(void);

int    swt;
char    emain(void)
{
    swt != 0 ? func1() : func2();

    if (swt != 0)
        func1();
    else    func2();

    return 0;
}

int    n, m;

int test0(void)
{
    return ((n += 10) > 100) ? n , m : n;    /* Okay */
}
int test1(void)
{
    return ((n += 10) > 100) ? n : n, m;    /* Okay */
}
int test2(void)
{
    return ((n += 10) > 100) ? n = 0: n;    /* Okay */
}
int test3(void)
{
    return ((n += 10) > 100) ? n: n = 0;    /* Error */
}
int test4(void)
{
    return ((n += 10) > 100) ? n = 50: n = 0;    /* Error */
}


Сообщение отредактировал Genadi Zawidowski - Oct 8 2013, 21:05
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Oct 9 2013, 06:34
Сообщение #3


неотягощённый злом
******

Группа: Свой
Сообщений: 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;
}


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- DASM   тернарный оператор   Oct 8 2013, 08:19
- - Сергей Борщ   Ничего не понял. Что ожидали, что получили, какие ...   Oct 8 2013, 08:27
- - DASM   Кодint test=1, a = 55, b = 22; (test==1) ?...   Oct 8 2013, 08:58
|- - Сергей Борщ   QUOTE (DASM @ Oct 8 2013, 11:58) Каков ре...   Oct 8 2013, 09:17
- - ViKo   У оператора присваивания ( = ) приоритет ниже, чем...   Oct 8 2013, 09:06
- - DASM   Я думаю тут вопрос не в приоритете, а в том, что С...   Oct 8 2013, 09:38
|- - Сергей Борщ   QUOTE (DASM @ Oct 8 2013, 12:38) Я думаю ...   Oct 8 2013, 10:03
- - DASM   не нашел ссылки про разность приоритетов   Oct 8 2013, 10:37
|- - demiurg_spb   Цитата(DASM @ Oct 8 2013, 14:37) не нашел...   Oct 8 2013, 10:48
||- - GetSmart   Двоеточие в этом выражении имхо должен иметь приор...   Oct 8 2013, 20:23
|- - Сергей Борщ   QUOTE (DASM @ Oct 8 2013, 13:37) не нашел...   Oct 8 2013, 10:52
|- - AHTOXA   Хм. А как же обратная совместимость?   Oct 8 2013, 10:58
- - Genadi Zawidowski   Ну сейчас тесты действительно другие были бы. Это ...   Oct 9 2013, 20:00


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 16:28
Рейтинг@Mail.ru


Страница сгенерированна за 0.01378 секунд с 7
ELECTRONIX ©2004-2016