true - истина
false - ложь
Команда, написанная выше, заставляет компьютер воспринимать true как ложь. Это напрочь убьёт почти любую программу, и это очень сложно обнаружить.
пример: if (true) say(Вася). Программисту кажется, что всегда будет печататься Вася, а на самом деле - нет, т.к. мы подменили значение true с истины на ложь.
Да не так уж это сложно обнаружить. Практически моментально можно понять, что блок if выполняется не так, как надо, посмотреть в дебаггере значение условия, увидеть, что там вместо true — false, вспомнить про "#define true false //счастливой отладки" и сделать соответствующий поиск.
В том случае, если rand() отдаёт число в диапазоне от 0 до 1, то эта конструкция будет вполне правильной.
Если rand() отдает любое число из любого диапазона, то конструкция будет синтаксически правильной в большинстве языков (кроме тех, где нельзя сравнивать целые с вещественными и нужно приводить типы явно, но таких языков немного).
Другое дело, что если мы говорим о языках, где rand() целочисленный, то условие будет равносильно rand() > 0 и, соответственно, в сишке, например, вероятность false-а падает раз в 30 относительно изначально задуманной вероятности.
Значение чего смотреть собираетесь? Там не переменная за условие отвечает. Хотя найти проблему действительно сложно не будет.
Ну именно литералы true и false чаще всего присваиваются как раз таки переменным, а внутри условий и циклов пишутся более нагруженные смыслом вещи, чем просто true/false. Исключение, разве что, while(true), но и его обнаружить будет очень легко, т.к. такие вечные циклы обычно можно по пальцам пересчитать (где, помимо run-loop'а они еще распостранены?) и изменение условие на противоположное скорее всего моментально сломает всю программу, так что дебагером найти будет очень и очень просто
Чтобы отладка было действительно веселой нужно юзать что-то вроде
#define if(x) if(__LINE__ % 5 == 0 || (x))
либо
#define while(x) while(rand() %10 == 3 || (x))
ну или что-то попроще, типа
#define while(x) if(x)
Хотя сейчас, конечно, большинство IDEшек по разному разукрашивают макросы и ключевые слова так что тоже не всегда сработает)
[зануда]
первый вариант будет упрощен до 2х случаев: if (1), то есть выкинут нахрен, и if (x), и первый, соответственно, будет легко вычислен, если такая строка вообще попадется (рандом - другое дело)
третий вариант вообще не будет компиляться при do {} while();
[/зануда]
первый вариант будет упрощен до 2х случаев: if (1), то есть выкинут нахрен, и if (x), и первый, соответственно, будет легко вычислен
Не совсем понял, что ты имеешь в виду под "будет легко вычислен". По ворнингу компилятора о бессмысленном ифе? Если да, то в мало-мальски большом проекте их никто не читает, т.к. их лезет слишком дофига. Если их не дофига и их читают, то либо а) проект небольшой и веселый макрос будет замечен тупо глазами, либо б) процесы разработки выстроены грамотно со всякими код-ревью, аккуратными прагмами вокруг тех мест, где ворнинга не избежать и т.п. В этом случае веселый макрос тоже будет замечен после ревью твоего коммита коллегой.
С do {} while() ты прав - это я не подумавши написал)
а вообще я не знаю в каких условиях это может прокатить, самая простая ide спалит подсветкой, не то что уж код ревью
это легальная конструкция (привет do { } while(1) в макросах)
Речь была про if. На if (true/false) компиляторы вполне себе ругаются без всякого стат. анализа ибо смысла в таких конструкциях нет и проверить их нетрудно. do { } while(10) - да, часто используется в сишке чтобы несколько команд завернуть в один макрос, либо в качестве костыля - замены try/catch (если много ошибок может возникнуть в коде, который должен за собой какие-то ресурсы освобождать - то этот кидающийся ошибками код оборачивается в ту конструкцию и тогда в случае ошибки можно брякнуть этот вайл, и ресурсы, таким образом, освобождать только 1 раз после ду-вайла).
речь не про это, а про то, что ошибка всегда будет в одном и том же месте в одно и то же вермя, нет рандомности,
Суть же не только в том, чтобы ошибка в разное время возникала. К тому-же, если в макросе с рандомом не сбрасывать сид, то возникать все будет тоже в одних и тех же местах.
Главная проблема с __LINE__ конструкцией будет в том, что в 90% попыток с дебаггером выяснить, почему все не работает, после того, как дебагер зайдет внутрь ифа, в который он не должен заходить, я (и думаю, не я один) первым делом кинулся бы проверять правильность условия путем ввода поп. переменных или чего-то подобного, тем самым сдвигая код с ифом ниже и переводя его рабочее состояние.
Итого, чтобы понять, что за хрень творится нужно будет догадаться просмотреть файлы после препроцессинга, либо просто догадаться поискать макросы с ифами.
А с рандомом, как раз, контора спалиться может даже легче, т.к. rand() - это вызов функции и тот факт, что дебагер на кадом ифе будет задерживаться на 2 шага, а если со step in-ом, то вообще прыгать в ебеня stdlib будет довольно палевным.
а вообще я не знаю в каких условиях это может прокатить, самая простая ide спалит подсветкой, не то что уж код ревью
Ну так то, подсветкой любые шаманства с макросами спалятся на раз-два, я об этом в самом первом комменте писал) Разве что подменять какие-то другие макросы можно, но тут особо не повеселишься.
Речь была про if. На if (true/false) компиляторы вполне себе ругаются без всякого стат
https://godbolt.org/g/YKlEV8 да ну (первые 2 строчки показать что ворнинги вообще работают)? емнип все комплай-тайм вещи легальны, и типа изначально предполагается что человек пишущий такое понимает зачем он это делает, а не просто так от балды, и это кстати достаточно плохо, что все перечисленные по ссылке выше опции не дают ворнингов в этом случае
я (и думаю, не я один) первым делом кинулся бы проверять правильность условия путем ввода поп. переменных или чего-то подобного, тем самым сдвигая код с ифом ниже и переводя его рабочее состояние.
имхо дело опыта
Итого, чтобы понять, что за хрень творится нужно будет догадаться просмотреть файлы после препроцессинга
и это туда же, для меня лично лезть в препроцессорный выхлоп забавно, быстрее в дизассемблер посмотришь, чем до такого додумаешься
Но когда ты снова пришёл на работу на листе с инструкцией сверху было написано "ЗАПОМНИ : "ДА" значит "НЕТ"!"
Когда тебе передали "ДА" ты вспомнил, что это значит "НЕТ" и передал "КОРАБЛИК" вместо "ПЕЧЕНЬКИ" так и здесь: #define значит "ЗАПОМНИ, что ... значит ..."
//
если Польша_стронг=true, то выведи_на_экран "Польша стронг!";
если Польша_стронг=false, то выведи_на_экран "Польша не стронг!";
//
Если код состоит только из этого и другой необходимой хрени, то если Польша стронг, то на экран выводится "Польша стронг!", а если нет, то "Польша не стронг!".
#define true false подменяет "true" на "false" и в любом случае Польша_стронг будет равно false и на экран будет выводиться "Польша не стронг!"
так проще:)
выведи_на_экран ("Польша " + (Польша_стронг ? "" : "не")+ " стронг!");
в любом ведь случае выводить на экран, зачем плодить лишний код)
Ага.
Директива define в С и С++ заменяет один текст на другой. С этим можно извращаться и дальше true/false, к примеру, #define 0 1
Си шарп например может в препроцессорные команды, в джавке вроде нет, но мне кажется, что это зависит от IDE, а не компилятора.
Грубо говоря, препроцессор проходится еще до компиляции по тексту программы и заменяет все значения на дефайнутые, потом подает уже этот листинг в компилятор.
я думаю, лучше юзать const, из-за таких шутников, которые могут задефайнить в самой жопе своего кода какую-нибудь переменную, а она уже была задефайнена) но проверку на дефайн делать конечно же не надо, можешь не сомневаться, что переменная названная PI абсолютна уникальна:) Кстати, еще идея возникла для командных программистов игр: задефайнить PI = 3.05 например и смотреть на забавные эффекты:)
В проге даж не упомню чтоб когда-то что-то сравнивал с константой true, а результат логического вычисления, например сравнения, ты так не переопределишь. Текст - чистые понты и наукообразие.
И про паскаль и бейсик дитям дотнета вообще рот лучше не открывать, собсна из-за таких вот "програмиздов" и стиль программирования сейчас - по быстрому чето налепить из виндоклассов и патчить до скончания века.
Раз уж децкий сад, то некто выше, не будем показывать пальцем уже высказался пренебрежительно про паскаль и бейсик. Так что, что называется не продолжайте. Пишите хоть на пхп, мне то что, только не гавкайте на другие языки, о которых вы похоже на уроке информатики только слышали.
ПыСы меж тем вы полезли в сентенции а главного в ветке не ощутили - в каком случае конструкция из ветки выше будет приносить реальный вред?
Да не воспринимай всерьез, какой шабаш программистов обходится без шуток за 300 про пхпшников?
в Java это System.gc(), причем он по пинку ничего не собирает, согласно спецификации он всего лишь повышает приоритет сборки мусора среди прочих операций, но ничего не гарантирует.
Да, это .NET
Collect() Forces an immediate garbage collection of all generations. Неужели тут по пинку а в жабе нет?