Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > тернарная операция


Автор: Pawl 2.10.2012, 10:40
Уважаемые форумчане, столкнулся с программой на С++, которая на входе получает 3 числа и меняет местами первое число с максимальным. Вот она:
Код

#include <stdio.h>

int main(void)
{
    int a, b, c;
    scanf("%d %d %d",&a,&b,&c);
    a=((b>=a)&&(b>=c)) ?
        a=a+b, b=a-b, a-b :
    (c>=a)&&(c>=b) ? a=a+c, c=a-c, a-c : a;
    printf("%d\ %d\ %d\n",a,b,c);
    scanf("\n");
}

Я удивился, какой гибкой в С++ может быть тернарная операция. Скажите, можно ли таким образом извратиться и в java?

Автор: Stolzen 2.10.2012, 11:23
Нет, запятыми несколько операторов в тернарной операции разделять нельзя. 
По мне, это не гибкость - это нечитаемое мессиво. 

Автор: Адриано 2.10.2012, 12:51
Pawl, интересный пример, спасибо.

Такой вопрос к форумчанам. Как раз по поводу применимости и читаемости тернарной операции. 

Я сталкивался с двумя крайними мнениями по поводу читаемости кода. 

1. Кое-кто считает, что если он САМ пишет программу (а не, допустим, в команде программистов), то и исходный код должен быть понятен только ему САМОМУ. И то, я так понимаю, с трудом. С/С++ для этого даёт большой простор. Как и Java, да и где угодно можно непонятно и запутанно написать.

2. Писать надо максимально понятно и читаемо. Такие люди не только тернарную операцию не любят использовать, но даже if -else, точнее else. Лучше написать несколько if. 
Потому что даже свою собственную программу уже через каких-нибудь несколько месяцев в подробностях не помнишь. Тем более через несколько лет. И чтобы прочитать и понять собственное творение, если оно сложнее, чем "Hallo, world", иногда требуется значительное 
время. Время, куда большее, чем потребовалось бы на написание комментариев и упорядочивание кода, тогда когда писал, -- на свежую голову, по свежей памяти.

А как вы думаете?
Хотелось бы для себя выработать правила. Исходя, конечно, из каких-то разумных аргументов. А то я на эту тернарную операцию посматриваю, и не могу понять для себя, -- стоит ли её применять на практике. Или это способ повыделываться, почудить, типа показать свою необыкновенность программерскую. "Для форсу бандитского" (с)  smile 

Автор: baldina 2.10.2012, 13:24
Цитата(Адриано @  2.10.2012,  12:51 Найти цитируемый пост)
Или это способ повыделываться, почудить, типа показать свою необыкновенность 

это способ сделать что-то, недоступное другими средствами.
тернарная операция - выражение, и может применяться везде, где допустимо выражение, в отличие от if/else.
Код

(pred ? x : y) = value;

Код

foo (cond ? x : y);


Автор: Pawl 2.10.2012, 14:48
Цитата(Stolzen @  2.10.2012,  11:23 Найти цитируемый пост)
Нет, запятыми несколько операторов в тернарной операции разделять нельзя.

А вообще, несколько операторов использовать можно?
Цитата(Stolzen @  2.10.2012,  11:23 Найти цитируемый пост)
По мне, это не гибкость - это нечитаемое мессиво.

Ну, да. Просто тут код плохо отформатирован.
Код

#include <stdio.h>

int main(void)
{
    int a, b, c;
    scanf("%d %d %d",&a,&b,&c);

    a = ( b>= a) && (b >= c) ? a = a + b, b = a - b, a-b :
    (c >= a) && (c >= b) ? a = a + c, c = a - c, a - c : a;

    printf("%d\ %d\ %d\n", a, b, c);
    scanf("\n");
}

Так лучше?

Автор: Stolzen 2.10.2012, 15:31
Цитата(Pawl @  2.10.2012,  15:48 Найти цитируемый пост)
Так лучше? 

Нет smile

Автор: Mirkes 12.10.2012, 06:25
А в Java существует аналог этого оператора?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)