Дорогие друзья нужна помощь. Не могу найти информацию по моему вопросу. Мне нужно до конца разобраться с оператором IF. Хорошим примером является эта задача if (number_sc % dva ==0 && number_sc > max) Вопрос состоит том, что до сегодняшнего дня я думал оператор IF только сравнивает значения (внутри круглых скобок) и если оно верное он начинает выполнять тело в {кудрявых скобках}. Но, в этой задачи я вижу, что оператор IF выполняет действие в (круглых скобках). Поясните как это вообще работает, в лекциях я этого не встречал и я подумал это будет интересно знать новичкам.
Sergey
6 уровень
Дорогие друзья, помогите понять логику синтаксиса IF в этой задаче
Обсуждается
Комментарии (13)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Sergey
20 октября 2024, 10:33
Дорогие Друзья ! Всем спасибо за ваш труд! Вы полностью открыли тему IF и это будет прекрасным пособием для тех кто хочет понять как это работает. Я бесконечно всем вам благодарен.
+3
ГоффMaster
19 октября 2024, 14:48
Буду краток:)
"Но, в этой задачи я вижу, что оператор IF выполняет действие в (круглых скобках)." - именно так. В скобках ифа, на самом деле, находится не условие, там находится логическое выражение. Всегда.
Оператор иф ВЫЧИСЛЯЕТ значение логического выражения в скобках. Для этого он последовательно выполняет логические операторы в порядке их очерёдности. Операторы сравнения (<, >, <= и другие) - это разновидность логических операторов, они такие-же, как и && или !, и они точно так же, как и другие операторы, выполняются.
А вот результат этого вычисления уже является условием выполнения тела ифа. Не само выражение в скобках является условием, а результат его вычисления. Если тру - то тело ифа выполняется, если фолс - пропускается.
+1
Денис Enterprise Java Developer
19 октября 2024, 09:01
Привет, тебе надо покурить булеву алгебру.
Концептуально ты прав, но только отчасти. if ничего не сравнивает. if это такая конструкция которая решает заходить в фигурные скобки или нет. Только в случае если в круглых скобках правда, в фигурные ты заходишь. Но это вовсе не значит что в круглых должно быть сравнение, там должно быть значение булевого типа.
Какие у буля есть значения? Ну очевидно это true или false.
Предположим у нас есть числовая переменная а равная единице и ты делаешь
if (a > 0)
Очевидно что a > 0 в данном случае вернёт ture, и блок кода отработает.
А вот в таком случае что будет?
if (true) - ведь мы передаём значение сразу, очевидно и тут блок отработает.
Теперь давай поиграемся с логикой.
if (a > 0 && a < 100)
Т.е. фактически запись звучит: "Если А больше ноля И меньше 100" Как видишь здесь у нас уже два условия, логическое И означает что правдивы должны быть оба. Если бы там стояло ИЛИ, то достаточно было бы выполниться любому одному из этих условий.
Рассмотрим какие здесь могут быть комбинации
a > 0 может вернуть true или false в зависимости от значения A
Аналогично и со вторым условием. Значит мы можем получить такие варианты:
true && true = true - это очевидно, оба условия выполняются, как и требует логическое И, значит и результат будет true
false && true = false - ожидаемый результат, И обязывает обе части неравенства выполняться, а здесь одна промахнулась, значит общий результат будет false. Аналогично будет и с зеркальной ситуацией - ture && false = false
Последняя вариация это false && false = false что в общем тоже не удивительно, ни одно из условий не выполняется, а значит и их сумма тоже.
Что нужно понимать. Не важно что написано в круглых скобках, важно чтобы оно возвращало значение логического типа, это могут быть сравнения, константные значения, результат работы методов и так далее. А вот как этот результат считается почитай в булевой алгебре. Еще и про короткие за
+2
Денис Enterprise Java Developer
19 октября 2024, 09:08
Ну и примерчик с методом.
Как видишь здесь в скобках вообще написан метод принимающий A как аргумент, но метод возвращает булев тип и так работает.
В сущности можно прикрутить и другие вариации, но они уже будут кустарными, например:
Т.е. метод фактически возвращает числовой тип, а под скобками мы проводим сравнение и результат тоже буль. Но такого в реальном коде обычно не делают. Если нужно что-то проверить... ну такое, сложное условие, с кучей вводных и зависимостей, обычно пишут метод возвращающий логический тип.
Самый простой и жизненный пример это метод из библиотеки ApacheCommons
Сначала ты проверяешь длину строки, если она 0 то строка пустая, потом проходишь по всей строке, если она состоит только из пробелов то строка тоже пустая, во всех остальных случаях строка не пустая и возвращается false
+1
Денис Enterprise Java Developer
19 октября 2024, 09:11
Представляешь себе как круто было бы писать в if вот такое сложное условие? А так можно обойтись банальным
Значок ! перед условием, как ты знаешь это отрицание. Т.е. код выводит строку в консоль если она НЕ пустая.
P.S. первое сообщение обрезалось, там была фраза:
"Еще и про короткое замыкание почитай, будет полезно". В двух словах это такой подход к формированию условий, чтобы избежать проверки всех условий записанных под if.
Здесь например при подсчёте D проверка не пойдёт дальше A, потому как оно равняется false, а как мы знаем, для логического И обе части неравенства должны возвращать true, т.е. как только мы узнаем что A это False дальнейшие сравнения и вычисления теряют смысл - результат уже известен, потому происходит короткое замыкание.
Аналогично с оператором ИЛИ, он считается слева направо
if (B || C) не пойдёт дальше проверки B, она уже true, а для логического ИЛИ достаточно чтобы True было в любой из частей. Раз true уже найдено - зачем считать дальше?
+3
Sergey
19 октября 2024, 11:35
Спасибо большое, что подробно пояснили и прошу прошения за мое невежество. Вот есть код из задания, который должен (считывать целые числа с клавиатуры до тех пор, пока не будет введено что-то другое: например,
строка или символ. Выведи на экран максимальное четное число из введенных.)
public class Chotnie_number {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int max = Integer.MIN_VALUE;
int dva = 2;
while (sc.hasNextInt()){
int number_sc = sc.nextInt();
if (number_sc % dva ==0 && number_sc > max){
max = number_sc;
}
Вот этот IF не просто выдает значения false или true он фильтрует целые числа которые делятся на 2 без остатка (в круглых скобках) и далее записывает значение в переменную {в фигурных скобках}. А если мы просто поставим в круглых скобках (true) значения будут другие. Мы можем даже сделать вот так if (number_sc % dva ==0 ) и результат будет верный, но ведь я здесь ничего не утверждаю и не сравниваю как это требует Булевая алгебра с ее парадигмой истина или лож. Я просто говорю - мой друг IF а давай отфильтруем с тобой нужные мне числа в (круглых скобках) и он отвечает без проблем (где истина в этом примере а где лож) ?
0
Anonymous #3509146
19 октября 2024, 12:06
if - это не фильтр, это условие в случае истинности которого будет выполняться определенный блок кода.
if не выдает значения true/false. Он просто проверяет результат выражения в круглых скобках, то что происходит в {} скобках - вы сами определяете, можете не присваивать значения в переменные, все зависит от того, что вам нужно сделать.
в самом задании снизу, под вашим кодом, пишутся значения (входные параметры), которые в дальнейшем при проверке - подставляются, как будто кто-то что-то на клавиатуре ввел. и вот эта строчка int number_sc = sc.nextInt(); она будет заполнена конкретным значением, которое указано ниже вашего кода (к сожалению, сейчас не могу сделать скриншот, потому что нет подходящей задачи).
например, number_sc заполняется значением 4, тогда действительно выполнится блок кода - max = number_sc, потому что все условия в if выполнены успешно и результат вычисленного в скобках () выражения = true
можете посмотреть как будет работать следующий код (можно посмотреть в интернете idea java online, вставить все нужные импорты в код, вставить код и побаловаться условиями, подавая разные значения на вход через консоль):
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int max = Integer.MIN_VALUE;
int dva = 2;
while (sc.hasNextInt()){
int number_sc = sc.nextInt();
if (number_sc % dva ==0 && number_sc > max){
max = number_sc;
System.out.println("gh");
}
else {System.out.println("fsdhfj");}
}}
0
Sergey
19 октября 2024, 12:45
Lessa, доброго времени суток. Условие истинности? и IF тоже ни как не может уложиться в моей голове -((( Условие - это значит мы с IF условились что ты меня пропустишь в {фигурные скобки в случае условной истинности ? }а если false то не пропустишь. В нашем случае я говорю if (number_sc % dva ==0) просто тупо дели числа, без истинны, без true или false.
0
Денис Enterprise Java Developer
19 октября 2024, 13:14
Ну как же не сравниваешь :) Давай разбирать условие
Что мы тут видим? Некоторая переменная number_sc далее берётся (грубо говоря) остаток от деления на число лежащее в переменной dva, результат сравнивается с нулём.
Т.е. например 4 % 2 = 0, правильно? правильно. 0 == 0? равно, значит это true.
С левой частью вроде разобрались, это таки логическое выражение :)
Поехали в правую, тут все совсем просто, тоже самое число number_sc сравнивается с тем что лежит в max, оказывается и здесь у нас логическое значение.
Ну а между обоими частями стоит логическое И, которое требует выполнения обоих условий для захода в if блок.
Вот и выходит этот крокодил в переводе на человеческий язык:
ЕСЛИ остаток от деления числа на два равен нулю И это число больше максимального МЫ ЗАХОДИМ в блок кода.
Как-то так.
В блок кода по if ты заходишь тогда и только тогда, когда в круглых скобках будет истина. Как ты можешь видеть вычисление логического результата может принимать разные причудливые формы :)
В условие твоей задачи и код я не вчитывался, и просто пытаюсь объяснить как это работает.
Например тебе нужны только четные числа? Не сложно
Нужен напротив нечет? Тоже не сложно замени равенство на неравенство, код тот же :)
Если же ты просто напишешь:
Такое выражение не будет иметь смысла, кусок кода внутри блока IF будет выполняться ВСЕГДА, потому оператор здесь вовсе не нужен. Аналогично с false в круглых скобках, только такой код не выполнится НИКОГДА
+1
Sergey
19 октября 2024, 13:36
Согласен 100%, но if в свою очередь number_sc % dva берет и делит цифры в веденные с клавиатуры, а потом их сравнивает с 0, так ? Я понимаю это так (ДЕСТВИЕ == СРАВНЕИЕ), то-есть, if накромсал числа и потом ненужные отсеял {а фигурные скобки, просто присвоили значения переменной куда эти числа и сохраняются}.
0
Денис Enterprise Java Developer
19 октября 2024, 14:21
Ну скорее во так:
(ЧИСЛОВОЙ_РЕЗУЛЬТАТ_ДЕЙСТВИЯ <Сравнение> КОНСТАНТА)
(number % 2 == 0)
И с числами IF ничего не делает, значение в number в данном случае не меняется, ведь присвоения не было, просто арифметическая операция и ее результат сравнивается с константным значением.
Вот в фигурных скобках уже происходят изменения, да. Переменной max присваивается новое значение.
+1
hidden #3303140
19 октября 2024, 14:22
... Мы можем даже сделать вот так if (number_sc % dva ==0 ) и результат будет верный, но ведь я здесь ничего не утверждаю и не сравниваю ...
Фрагмент твоей фразы.
"==" это оператор сравнения, поэтому здесь ты как раз самым натуральным образом сравниваешь. Может быть эта простая мысль поможет подтолкнуть к пониманию.
Эта функция `if (number_sc % dva == 0)` - это не команда отобрать все чётные числа магическим образом, эта проверка на то, если ("if" = англ. "если"), так вотесли остаток от деления числа number_sc на число dva равен нулю, и всё. Одного конкретного числа. На dva. Он либо равен нулю, либо не равен. То есть результат сравнения "==" будет либо true либо false.
А для того, чтобы отобрать все числа, у тебя снаружи этого ифа находится цикл, который в проверяемую переменную помещает различные значения. И каждое из них в отдельности проверяется этим условным блоком (ифом).
Очень рекомендую познакомиться с блок-схемами, чтобы научиться лучше понимать алгоритмы. Вещь старая как книги про профессора Фортрана, но до сих пор является хорошей визуализацией
Кстати, как ты можешь увидеть, на схеме и в логике while обозначается таким же блоком, как и if. Разница заключается лишь в том, что тело условного блока if выполняется (или не выполняется) один раз, то есть проверка происходит лишь однажды, а цикл while будет исполняться до тех пор, пока условие остаётся истинным. То есть после выполнения тела цикла проверка последует ещё раз. Это отражено на схеме.
+2
Sergey
20 октября 2024, 10:25
Дорогой друг, доброго дня. Я перечитал все ответы и посмотрел на схему и мне кажется, что мы здесь полностью раскрыли тему с оператором IF. Это будет прекрасное пособие для тех кто хочет понять как это работает. Всем большое спасибо за ваш труд и подробное объяснение.
0