Оператор ?:

tonline_kms65_1

Участник
Сообщения
565
Реакции
225
Всем здравствуйте.
Нужна помощь с этим сишным оператором, не знал что он здесь работает, а оказывается работает, да еще как! И это очень хорошо.
Наверно этот вопрос больше к теоретикам. В разновидностях С он записывается по разному, поэтому не будем трогать си.

Начну сразу с sourcepawn'а.
например такая запись ((условие) ? выполнение 1 : выполнение 2);
здесь все понятно если условие = true, то выполняется выполнение 1, и соответственно наоборот.
Если понятнее:
int условие = 1;
if (10-9 == условие) выполнение 1;

if (10-2 == условие) выполнение 2;
как то так.

Так вот у меня вопрос - а как можно дополнить эту запись выражением если не правда и если не ложь?
т.е. добавить третье условие (или больше). Я не могу сообразить. А ведь по идее можно, вот только как.
 
Последнее редактирование:

Rostu

Добрая душа
Сообщения
986
Реакции
623
@tonline_kms65_1,
PHP:
int x = 1;
int y = 5;

int temp = x == 3 ? если true [x == 3]y == 5 ? если true [y == 5] 2 : false [y != 5] 7 : false [ x != 3] y == 5 ? true [y == 5] 1 : false [ y  != 5] 9

int temp2 = x == 3 ? y == 5 ? 2 : 7 : y == 5 ? 1 : 9;

Должно сработать
 

tonline_kms65_1

Участник
Сообщения
565
Реакции
225
Жесть жестянная.:biggrin:
Расписал бы по русски. Народу много смотрит. Пригодится всем точно.
И кстати, что в первую очередь выполняется? Они же зависимые. Я, если честно, пока сообразить не могу.
 

WhoAmI / WillStriX

Мошенник
Сообщения
222
Реакции
129
Жесть жестянная.:biggrin:
Расписал бы по русски. Народу много смотрит. Пригодится всем точно.
И кстати, что в первую очередь выполняется? Они же зависимые. Я, если честно, пока сообразить не могу.
Что непонятного?
int x = 5;
int temp = (x == 3) ? 1 : ((x < 3) ? 2 : 3); //Если x равен 3 то, temp = 1, иначе проверка x < 3 и по той же схеме
Таким образом, если x == 3, то temp 1, если меньше 3 то 2, если больше, то 3
 
Последнее редактирование:

Саша Шеин

Кому костылей?
Сообщения
1,697
Реакции
621
nt условие = 1;
if (10-9 == условие) выполнение 1;

if (10-2 == условие) выполнение 2;
Тут скорее:
C-подобный:
if( Условие ) { Операция_1; }
else { Операция_2; }

Так можно записать любое условие, но без конструкции elseif, if должен быть вложен в else, например
C-подобный:
if( Условие1 ) { Действие_1; }
else {
 // Условие1 ложно
 if( Условие 2 ) { Дейсвие_2; }
 else {
  // Условие2 ложно
  // Оба условия являются ложными
 Действие_3;
 }
}
Если убрать из этой записи все if, else и фигурные скобки, то получится:
C-подобный:
( Условие1 ) ? Действие_1 :
( ( Условие2 ) ? Дейсвие_2 :
Действие_3 )
Получается, что знак вопроса как в предложениях, на которые можно ответить только: Да, Нет, Новым вопросом.
Эти "Новые вопросы" стоит обозначать (Экранировать?) в скобках, так будет понятнее и меньше проблем при компиляции.
 

WhoAmI / WillStriX

Мошенник
Сообщения
222
Реакции
129
Тут скорее:
C-подобный:
if( Условие ) { Операция_1; }
else { Операция_2; }

Так можно записать любое условие, но без конструкции elseif, if должен быть вложен в else, например
C-подобный:
if( Условие1 ) { Действие_1; }
else {
 // Условие1 ложно
 if( Условие 2 ) { Дейсвие_2; }
 else {
  // Условие2 ложно
  // Оба условия являются ложными
 Действие_3;
 }
}
Если убрать из этой записи все if, else и фигурные скобки, то получится:
C-подобный:
( Условие1 ) ? Действие_1 :
( ( Условие2 ) ? Дейсвие_2 :
Действие_3 )
Получается, что знак вопроса как в предложениях, на которые можно ответить только: Да, Нет, Новым вопросом.
Эти "Новые вопросы" стоит обозначать (Экранировать?) в скобках, так будет понятнее и меньше проблем при компиляции.
Молодец, что переделал мою запись
 

Саша Шеин

Кому костылей?
Сообщения
1,697
Реакции
621
Пригодится то пригодится, но не факт, что это этично. Быдлокодерством пахнет...
Это вполне корректный код, который выглядит красиво. Но насколько я знаю для работоспособности данного когда создаётся лишняя переменная(ные)
--- Добавлено позже ---
@WillStriX, я не переделывал ваше сообщение, я написал так как считаю нужным объяснить. Т.к. человек попросил
Жесть жестянная.:biggrin:
Расписал бы по русски
--- Добавлено позже ---
Что непонятного?
int x = 5;
int temp = (x == 3) ? 1 : ((x < 3) ? 2 : 3); //Если x равен 3 то, temp = 1, иначе проверка x < 3 и по той же схеме
Таким образом, если x == 3, то temp 1, если меньше 3 то 2, если больше, то 3
А то что вы написали не совсем корректно, например что значит ",то temp 1", тогда уж написали бы ", то temp равен 1".
Да и всеравно получилось запутано , это лично мое мнение :)
Да и не видел я вашего сообщения, открыл топик, ушел, пришел и написал.
 
Последнее редактирование:

Kruzya

Участник
Сообщения
12,970
Реакции
10,924
  • Команда форума
  • #10
Лучше расписывать на несколько строчек данные условия. Так нагляднее запись выглядит.
PHP:
int iValue = (iAnotherValue == 5 ? 
  10 : (
    iAnotherValue == 15 ?
    5 :
    10
  )
);
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,569
Реакции
5,071
@tonline_kms65_1, периодически использую в своих плагинах
вполне удобно, если вариантов на выходе немного
кмк вполне понятно (в других языках тоже встречается такое, кстати) и иногда сокращает текст кода

и вообще нет необходимости в лишних скобках
Вот это:
PHP:
int x = 5;
int temp = (x == 3) ? 1 : ((x < 3) ? 2 : 3);
отлично читается компилятором в таком виде:
PHP:
int x = 5;
int temp = x == 3 ? 1 : (x < 3 ? 2 : 3);
 

Danyas

Участник
Сообщения
2,173
Реакции
1,072
Тоже у себя часто использую, достаточно много кода сокращает, и всё вполне понятно
PHP:
public void Event_BombStartDefuse(Event event, const char[] name, bool dontBroadcast)
{
    PrintCenterTextAll("Бомба разминирываеться %s сапёра.", GetEventBool(event, "haskit") ? "с набором" : "без набора");
}
 

tonline_kms65_1

Участник
Сообщения
565
Реакции
225
Пригодится то пригодится, но не факт, что это этично. Быдлокодерством пахнет...
Это с какого такого перепуга? Обычный сишный оператор. Да и не только сишный. Вполне удобный, я просто раньше не думал что он в Pawn'е работает. Вот уж реально sourcepawn наследник с. Это приятно.
Просто эта запись не совсем понятна, пока у ней 2 значения все просто, а вот как больше 2 - то возникают недопонимания. Но по большому счету она удобнее чем if, else if, else, или тот-же switch.

Если убрать из этой записи все if, else и фигурные скобки, то получится:
( Условие1 ) ? Действие_1 :
( ( Условие2 ) ? Дейсвие_2 :
Действие_3 )
Получается, что знак вопроса как в предложениях, на которые можно ответить только: Да, Нет, Новым вопросом.
Эти "Новые вопросы" стоит обозначать (Экранировать?) в скобках, так будет понятнее и меньше проблем при компиляции.

Вот, по моему, самое понятное объяснение. Спасибо.
--- Добавлено позже ---
tonline_kms65_1 сказал(а):
nt условие = 1;
if (10-9 == условие) выполнение 1;
if (10-2 == условие) выполнение 2;

Тут скорее:
if( Условие ) { Операция_1; }
else { Операция_2; }

nt условие = 1;
if (10-9 == условие) выполнение 1;
if (10-2 == условие) выполнение 2;
else выполнение 3; //вот это нужно было на выходе получить.
 
Последнее редактирование:

Grey83

не пишу плагины с весны 2022
Сообщения
8,569
Реакции
5,071
int num = 1;
num == 1 ? SomeFunction_1() : (num == 8 ? SomeFunction_2() : SomeFunction_3());


ну или

int num = 1;
num != 1 ? (num != 8 ? SomeFunction_3() : SomeFunction_2()) : SomeFunction_1();


хотя я ещё не проверял работает ли это
 
Сверху Снизу