Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 21.09.2019
Сообщений: 101

Какое значение будет в тернарных операциях?

27.10.2019, 13:39. Показов 1185. Ответов 16
Метки си (Все метки)

Студворк — интернет-сервис помощи студентам
Какое значение будет в тернарных операциях? операнд a т.е. первый может быть числом (веществ или целым) или вовсе указателем:это 3 действия
c = a > b ? a : b;

c = (a * b) > 0;

c = a > 0 ? a : -a;
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.10.2019, 13:39
Ответы с готовыми решениями:

Какое значение будет иметь а?
Помогите выбрать правильный вариант в этой задаче(и еще объясните, как вы считали). Заранее спасибо. int a; int f(int x) { a=0; ...

Какое значение будет принимать переменная?
Какое значение будет принимать переменная R после исполнения оператора, если переменная Y=26? R=Odd(Y)

Какое будет значение каждого тока
Здравствуйте помогите определить все токи. Чтобы мне сравнивать задания. 55 вариант

16
Мозгоправ
 Аватар для L0M
1745 / 1039 / 468
Регистрация: 01.10.2018
Сообщений: 2,138
Записей в блоге: 2
27.10.2019, 17:20
olavin, тренарная операция - это примерно так:
Code
1
2
3
4
if (первый_операнд)
    второй_операнд
else
    третий_операнд
Отличие в том, что тренарная операция возвращает либо второй, либо третий операнд в зависимости от значения первого.
0
207 / 58 / 19
Регистрация: 18.02.2018
Сообщений: 256
27.10.2019, 17:43
Смотрим википедию:

"In computer programming, ?: is a ternary operator that is part of the syntax for basic conditional expressions in several programming languages. It is commonly referred to as the conditional operator, inline if (iif), or ternary if. An expression a ? b : c evaluates to b if the value of a is true, and otherwise to c. One can read it aloud as "if a then b otherwise c"."

В чем суть тернарной конструкции? - в том, что она прекрасна для небольших проверок.

Разберёмся в обыкновенной условной конструкцией if: ты подаёшь выражение в условие, которое, в конечном счёте будет либо ложным, либо истинным. Например, в Си, результат оценивается по его значению. Ты, наверное, знаком с таким способ зацикливания программы:

C
1
2
3
while (1) {
    /* do anything */
}
Дело в том, что единственное значение, которое оценивается как ложное - ноль. Здесь же, в скобочках, грубо говоря, стоит единица (не является нулём). Вдобавок, "голое" число - это константа => цикл (думаю, уже и так понятно) будет вечным.

Кликните здесь для просмотра всего текста
> "Nahn! True - это 1, а false - 0. Никаких других значений!"

https://www.cs.uic.edu/~jbell/... sions.html


А теперь вернёмся к ИФу. В зависимости от значения, которое получилось в скобочках, грубо говоря, программа будет решать что делать. Но почему сразу if, коль циклы, свитчи, etc, работают, по сути, точно также? - потому что мы говорим про тернарный оператор, который тесно связан именно с ИФом. Тернарная конструкция отличается от if лишь, тем что она поддерживает лишь по одному выражению в каждом операнде. А на кой чёрт тебе больше?! И вот тут мы подходим к самому интересному. Взглянем на шаблон тернарной конструкции в википедии:

PHP
1
логическое выражение ? выражение 1 : выражение 2
Не буду вдаваться в объяснения, ибо мне сложно и лень всё расписывать. Просто перепишу пример выше в обыкновенную условную конструкцию if:

PHP
1
2
3
4
if (логическое выражение)
    выражение 1
else
    выражение 2
0
Мозгоправ
 Аватар для L0M
1745 / 1039 / 468
Регистрация: 01.10.2018
Сообщений: 2,138
Записей в блоге: 2
28.10.2019, 00:29
Ksyrx, позвольте уточнить:

Цитата Сообщение от Ksyrx Посмотреть сообщение
> "Nahn! True - это 1, а false - 0. Никаких других значений!"
false - это 0. true - это НЕ 0.

Цитата Сообщение от Ksyrx Посмотреть сообщение
Тернарная конструкция отличается от if лишь, тем что она поддерживает лишь по одному выражению в каждом операнде.
Выполнение нескольких "операторов" (с некоторыми ограничениями) можно выполнить в операндах тренарного оператора путём их комбинации с помощью оператора ,. Хотя это и извращение. Но в общем вы правы.

Основное отличие от if в том, что тренарная операция возвращает результат. Что накладывает на второй и третий операнды ограничение: эти выражения должны возвращать результат одного типа. В противном случае можно получить либо ошибку компиляции, либо не получить ошибку компиляции, если компилятор сумеет сделать приведение типа второго операнда к типу первого (иногда очень неочевидное преобразование), на чём можно поиметь весьма загадочное поведение программы.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12938 / 6805 / 1821
Регистрация: 18.10.2014
Сообщений: 17,224
28.10.2019, 01:20
Цитата Сообщение от olavin Посмотреть сообщение
Какое значение будет в тернарных операциях?
Откуда ж нам знать, какое будет значение, если мы не знаем исходных значений?

Цитата Сообщение от Ksyrx Посмотреть сообщение
Не буду вдаваться в объяснения, ибо мне сложно и лень всё расписывать. Просто перепишу пример выше в обыкновенную условную конструкцию if:

PHP
1
2
3
4
if (логическое выражение)
    выражение 1
else
    выражение 2
Что, разумеется, является совершенно бесполезным и ничего не объясняющим "переписыванием", ибо исходный вариант с ?: сам по себе целиком является выражением, а конструкция с if выражением не является.

Цитата Сообщение от L0M Посмотреть сообщение
Ksyrx, позвольте уточнить:
false - это 0. true - это НЕ 0.
Это дискуссия не о чем.

При использовании арифметических значений в логических контекстах 0 расценивается как "ложь", а все остальное - как "истина". Это касается и преобразований арифметических значений к типу _Bool.

В противоположную же сторону: логические выражения в языке С порождают только 0 или 1 в качестве результата.
0
0 / 0 / 0
Регистрация: 21.09.2019
Сообщений: 101
28.10.2019, 13:40  [ТС]
А что это за операция a : b (это присваивание)?

Добавлено через 46 минут
а как понять это если истина, то
c = a > 0 ? a : -a;
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,921
28.10.2019, 14:14
Цитата Сообщение от olavin Посмотреть сообщение
А что это за операция a : b (это присваивание)?
Нет, это ошибка синтаксиса. В Си нет оператора :
Зато есть оператор ?: (x?y:z) означает "если x истина, вернуть y, если ложь - вернуть z".
Чуть ли не единственный пример, где тернарный оператор удобнее обычного условия:
C
1
printf("%s\n", x?"true":"false");
1
2487 / 1151 / 709
Регистрация: 25.04.2016
Сообщений: 3,315
28.10.2019, 19:12
olavin, первый пример:
c = a > b ? a : b;

if (a>b) c = a;
else c = b;

второй:
c = (a * b) > 0;

if (a*b > 0) c = !0;
else c = 0;

третий:
c = a > 0 ? a : -a;

if (a>0) c = a;
else c = -a;
0
207 / 58 / 19
Регистрация: 18.02.2018
Сообщений: 256
08.11.2019, 20:13
Цитата Сообщение от L0M Посмотреть сообщение
false - это 0. true - это НЕ 0.
Уточняй, пожалуйста, после того как внимательно прочитаешь мой ответ.

Добавлено через 1 минуту
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
При использовании арифметических значений в логических контекстах 0 расценивается как "ложь", а все остальное - как "истина". Это касается и преобразований арифметических значений к типу _Bool.
В противоположную же сторону: логические выражения в языке С порождают только 0 или 1 в качестве результата.
Я же по-русски написал то же самое!

Добавлено через 6 минут
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Что, разумеется, является совершенно бесполезным и ничего не объясняющим "переписыванием", ибо исходный вариант с ?: сам по себе целиком является выражением, а конструкция с if выражением не является.
Это уже субъективизм.
Я попытался написать понятно. Если ты не понял - напиши по-своему так, как считаешь, якобы, лучше.

Более грубо: одно выражение после ИФ - это то, что идёт после вопросика (!). А после else - то, что идет после двоеточия.

Думаю, на форуме программистов, в разделе "Си для начинающих", всем известно, что тернарная конструкция в Си допускает лишь по одному выражению после каждого оператора, и это объяснять - не нужно.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12938 / 6805 / 1821
Регистрация: 18.10.2014
Сообщений: 17,224
08.11.2019, 20:17
Цитата Сообщение от Ksyrx Посмотреть сообщение
Я же по-русски написал то же самое!
Ым... Целью моего сообщения являлось напомнить собравшимся, что при преобразовании из логического контекста в арифметический контекст значения 0 для "ложь" и 1 для "истина" гарантированы языком. Где вы "написали то же самое"?
0
207 / 58 / 19
Регистрация: 18.02.2018
Сообщений: 256
08.11.2019, 20:23
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Нет, это ошибка синтаксиса. В Си нет оператора :
Вообще-то, в Си есть оператор ':'.

Ты знаком с битовыми полями?

А-ля какому-нибудь definition простенькой структурки, ты бы мог написать так, если бы хотел "выровнять" битовую ширину каждого поля под свои нужды (весьма полезная штука в сетевом):
C
1
2
3
4
5
6
struct {
    unsigned int e1 : 6;
    unsigned int e2 : 6;
    unsigned int e3 : 6;
    unsigned int e4 : 6;
} base64enc;
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12938 / 6805 / 1821
Регистрация: 18.10.2014
Сообщений: 17,224
08.11.2019, 20:26
Цитата Сообщение от Ksyrx Посмотреть сообщение
Более грубо: одно выражение после ИФ - это то, что идёт после вопросика (!). А после else - то, что идет после двоеточия.
Ну это, разумеется, не верно. Выражения с ?: обычно имеют вид

C
1
a = b ? c : d;
для которой эквивалентной конструкцией является

C
1
2
3
4
if (b)
  a = c;
else
  a = d;
Как видите, ограничиться лишь "после вопросика" и "после двоеточия" нам не удается.

Цитата Сообщение от Ksyrx Посмотреть сообщение
Думаю, на форуме программистов, в разделе "Си для начинающих", всем известно, что тернарная конструкция в Си допускает лишь по одному выражению после каждого оператора, и это объяснять - не нужно.
Ну точно также и конструкция if допускает лишь по одному statement в истинной и ложной ветви. Но мне не совсем понятно, какой глубинный смысл вы вкладываете в это "по одному". При чем здесь это вообще?

Цитата Сообщение от Ksyrx Посмотреть сообщение
Вообще-то, в Си есть оператор ':'.
Нет, такого оператора в языке С нет.

Цитата Сообщение от Ksyrx Посмотреть сообщение
Ты знаком с битовыми полями?
Что за чушь? Двоеточие в синтаксисе битовых полей не является никаким "оператором". Операторы в языке С бывают только в выражениях. Больше нигде.
0
207 / 58 / 19
Регистрация: 18.02.2018
Сообщений: 256
08.11.2019, 20:28
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Ым... Целью моего сообщения являлось напомнить собравшимся, что при преобразовании из логического контекста в арифметический контекст значения 0 для "ложь" и 1 для "истина" гарантированы языком. Где вы "написали то же самое"?
Перечитайте своё сообщение:
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
При использовании арифметических значений в логических контекстах 0 расценивается как "ложь", а все остальное - как "истина". Это касается и преобразований арифметических значений к типу _Bool.
И что ответил я:
Цитата Сообщение от Ksyrx Посмотреть сообщение
Дело в том, что единственное значение, которое оценивается как ложное - ноль. Здесь же, в скобочках, грубо говоря, стоит единица (не является нулём). Вдобавок, "голое" число - это константа => цикл (думаю, уже и так понятно) будет вечным.
А вот про логические выражения... Эм, а на фега, извеньте, это припоминать? Ну да, любое логическое выражение всегда вернёт либо нолик, либо единичку. И к чему это?
0
фрилансер
 Аватар для Алексей1153
6455 / 5657 / 1129
Регистрация: 11.10.2019
Сообщений: 15,070
08.11.2019, 20:28
Ksyrx, это не оператор, а часть синтаксиса. Ещё двоеточие ставится после метки для goto или switch
0
207 / 58 / 19
Регистрация: 18.02.2018
Сообщений: 256
08.11.2019, 20:31
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Что за чушь? Двоеточие в синтаксисе битовых полей не является никаким "оператором". Операторы в языке С бывают только в выражениях. Больше нигде.
Не помню как цитировать ваше сообщение целиком...
Короче, вы со мной, простите, сраться решили? Я делать этого не собираюсь. Я объяснил вам, что имел ввиду. Не поняли, пафосный пушистик, ответьте, опять-таки, по-своему. Зачем касаться меня? У вас разрыв шаблона? Так не смотрите на мои ответы...
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12938 / 6805 / 1821
Регистрация: 18.10.2014
Сообщений: 17,224
08.11.2019, 20:39
Цитата Сообщение от Ksyrx Посмотреть сообщение
Перечитайте своё сообщение:
Зачем вы отрезали от моего сообщения лишь половину?

Цитата Сообщение от Ksyrx Посмотреть сообщение
Ну да, любое логическое выражение всегда вернёт либо нолик, либо единичку. И к чему это?
К тому, что среди определенных индивидуумов здесь возникло некоторое непонимание на тему того, когда "истина" - это "все что не 0", и когда "истина" - это именно строго 1. Я лишь полностью прояснил и закрыл этот вопрос.

Цитата Сообщение от Ksyrx Посмотреть сообщение
Короче, вы со мной, простите, сраться решили?
Во-первых, следите за своим лексиконом.

Во-вторых, здесь у нас - технический форум, конференция по языку С, а не дворовая тусовка. Постарайтесь привыкнуть к тому, что всякий раз, когда вы будете нести чушь, вас будут поправлять, как и в любом другом техническом форуме. В этом нет никаких попыток "сраться". Более того, когда кто-то поправляет ваши ошибки (параллельно преподавая вам урок), возьмите в привычку говорить за это "спасибо". Если вас подобное положение вещей не устраивает, то, боюсь, в технических форумах вы не приживетесь.
0
Мозгоправ
 Аватар для L0M
1745 / 1039 / 468
Регистрация: 01.10.2018
Сообщений: 2,138
Записей в блоге: 2
08.11.2019, 20:41
Ksyrx, ок, вы сначала написали, что "единственное значение, которое оценивается как ложное - ноль" и следующим абзацем, под спойлером, цитируете "Nahn! True - это 1, а false - 0. Никаких других значений!" (кстати, я не нашёл слова Nahn по указанной вами ссылке). Вы как-то уж сами определитесь, что вы хотели сказать.

Цитата Сообщение от Ksyrx Посмотреть сообщение
Это уже субъективизм.
Неправы. И я, и TheCalligrapher пытались донести ТС (а теперь и вам), что тренарный оператор "сам по себе целиком является выражением, а конструкция с if выражением не является".
C
1
2
3
4
5
// Т.е. можно написать
int a = b > c ? 1 : 2;
 
// а с if такая конструкция невозможна:
int a = if (b > c) 1 else 2;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.11.2019, 20:41
Помогаю со студенческими работами здесь

Какое значение будет иметь переменная d
Вариант 1 1. Какое значение будет иметь переменная d после выполнения операторов при a = 3, b = 1, d = 0: 1) If a>b...

Какое значение будет выведено при выполнении операторов?
int a,b,*pa,*pb; a=1; b=2; pa=&a; pb=&b; *pb=a; *pa=b; cout<<*pa<<" "<<*pb;

Какое значение будет напечатано в результате выполнения программы?
Какое значение будет напечатано в результате выполнения программы? type mass=array of integer; mtr=array of mass; var i,j:integer;...

Какое значение будет выведено в результате работы программы?
#include <iostream> using namespace std; int main() { int k = 0; for (int i = 2; k * k < 10; i < 3, k++, k--) { k += 1; } ...

Какое значение будет выведено в результате выполнения программы
Задан одномерный массив A=(7,5,4,6,3,2,1). Какое значение будет выведено в результате выполнения программы: var a:array of integer; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru