C/C++

Учу с++, можете объяснить на пальцах? не понимаю работу условия в теле цикла... if ((i+1)%3 != 0)

Допустим если просто написать if (i%3 == 0) будет как бы в цикле условие выполняться через 3! это понятно! И то я его понял лишь запустив программу и посмотрев как рабоает! а на уровне языка я его не понял! То есть что значит == 0. Прям туман какой то в голове
Уже не говорю про это if ((i+1)%3 != 0) хотя я знаю что это условие будет делать! но не могу понять на уровне языка программирования что за что отвечает...
Андрей @}->
Андрей @}->
975
Когда вы делите одно целое число на другое целое число, то оно может поделиться нацело, то есть если частное умножить на делитель, получите делимое. Во всех остальных случаях деление будет с остатком. Там где остатка нет, принято считать, что остаток равен нулю. Это и есть ваш тяжёлый случай.
Bekulan Нурланбекович
70 827
Лучший ответ
То есть, ты знаешь, что возвращает выражение i%3 ?
И что???

Теперь, что возвращает (i+1)%3 ???
Андрей @}-> ну в случае с условием if (i%3 == 0) я понял, когда остаток деления будет == 0 условие выполняется!
По поводу второго условия if ((i+1)%3 != 0) я затрудняюсь в понимании... Ну я знаю что при запуске программы будет пропускаться каждое третий раз выполнения условия в цикле
Я для эксперимента написал так i%3 != 0 и получился почти такой же результат только пропускается каждое первое раз выполнения условия из 3х в теле цикла...
и я тоже впринципе понял, что выполнение условия в теле цикла будет выполнятся до тех пор пока остатком деления не станет 0.
Возвращаюсь к этому условию в теле цикла if ((i+1)%3 != 0)
и очевидно что часть (i+1) влияет на условие. но что именно она делает я не догоняю... и все так же туман.
Андрей @}-> Как эта часть if ((i+1)%3 != 0) меняет меняет выполнение условие i%3 != 0
if ((i+1)%3 != 0) - каждая 3 е условие пропускается
if(i%3 != 0 ) - каждое 1е условие пропускается
a % b - один из бинарных операторов, позволяет узнать остаток от целочисленного деления a на b ( 5 % 3 будет 2)
== и != бинарные операторы сравнения, которые возвращают true или false
a == b будет возвращать true если a и b равны между собой и false если нет
a != b будет делать все наоборот, если a и b равны он вернет false и true если НЕ равны.
вообще символ! в си-подобных языках унарный оператор и означает инверсию логического значения или его изменение на противоположное (было true станет false, например !(7 == 2) будет true)

далее a и b не обязаны быть только заранее определенными значениями, ими так же могут быть значения переменных, мат. операций или других функций, в случае мат. операций их часто берут в скобки чтобы однозначно указать порядок действий (хотя он такой же как в математике) и избежать проблем толкования компилятором

т. е. в вашем случае выражение (i + 1) и есть a

вам бы подучить унарные и бинарные операторы и порядок действий
так же вам возможно поможет понимание того что (i + 1) вычисляется но в i не сохраняется т. к. оператор + не изменяет исходных данных (для этого есть присвоение или =)
Андрей @}-> я вот этого пока понять не могу.... то что в скобках на том и акцент? и выполняется первым?
Андрей @}-> ну в случае с условием if (i%3 == 0) я понял, когда остаток деления будет == 0 условие выполняется!
По поводу второго условия if ((i+1)%3 != 0) я затрудняюсь в понимании... Ну я знаю что при запуске программы будет пропускаться каждое третий раз выполнения условия в цикле
Я для эксперимента написал так i%3 != 0 и получился почти такой же результат только пропускается каждое первое раз выполнения условия из 3х в теле цикла...
и я тоже впринципе понял, что выполнение условия в теле цикла будет выполнятся до тех пор пока остатком деления не станет 0.
Возвращаюсь к этому условию в теле цикла if ((i+1)%3 != 0)
и очевидно что часть (i+1) влияет на условие. но что именно она делает я не догоняю... и все так же туман.
Анатолий Ерохин если первое условие будет выполянться только каждую третью итерацию цикла (т. е. когда i будет равен 0, 3, 6 и т. д.) то второе условие делает все наоборот - НЕ выполняется каждую третью итерацию, а +1 это всего лишь "отступ/смещение" которое приводит к тому что условие будет НЕ выполняться когда i = -1, 2, 5 и т. д. прибавляя к i единицу вы как бы отодвигаете ту границу на которое данное условие заточено (это уже мат. часть нежели программирование)

а касательно первого пропуска - i небось с нуля у вас начинается в цикле (аля for (int i =0; i < __; i++) { ...} ) отсюда и пропуск - 0 кратен любому числу :D измените стартовое значение в for и получите такой же результат но с i%3 != 0
Если остаток от деления на 3 == 0, то выполнить условие

% - выявить остаток от деления
Пр
5 % 3 = 2
6 % 3 = 0
7 % 3 = 1
Андрей @}-> а если написать 1? почему 0 выполнить условие? ведь 0 это false или нет?