Что мне следует использовать: `! IsGood` или` IsGood == false`?

Я все время вижу код, который выполняет такие проверки

if (IsGood == false)
{
   DoSomething();
}

или это

if (IsGood == true)
{
   DoSomething();
}

Я ненавижу этот синтаксис и всегда использую следующий синтаксис.

if (IsGood)
{
   DoSomething();
}

or

if (!IsGood)
{
   DoSomething();
}

Есть ли причина использовать "== true" или "== false"?

Это удобочитаемость? Неужели люди просто не понимают логические переменные?

Кроме того, есть ли разница в производительности между ними?


person Community    schedule 10.12.2008    source источник
comment
Если это действительно так вас беспокоит, это будет долгая и тяжелая жизнь для вас.   -  person GEOCHET    schedule 10.12.2008
comment
Справедливый вопрос, OP не кажется мне слишком раздраженным.   -  person annakata    schedule 10.12.2008
comment
Да, это действительно так. Я сомневаюсь в себе в простых вещах время от времени и иногда нахожу вескую причину, чтобы изменить свой образ жизни ...   -  person Michael Haren    schedule 10.12.2008
comment
Поскольку тот же вопрос применяется как минимум к c / c ++ / Java, хотите ли вы пометить его без привязки к языку?   -  person Martin Beckett    schedule 10.12.2008
comment
Меня это действительно не сильно беспокоит, я просто часто это вижу и задавался вопросом, есть ли какая-то причина ... Тем не менее, я, конечно, предпочитаю одно другому.   -  person chills42    schedule 10.12.2008
comment
Это применимо к VB и его вариациям, php и другим не типизированным языкам.   -  person NotMe    schedule 10.12.2008
comment
Мне кажется, что вопрос, который вы задаете, не совсем зависит от языка, если вы предполагаете, что Boolean является типом для всех языков.   -  person Jim Nelson    schedule 11.12.2008
comment
Изначально мой вопрос предназначался для C #.   -  person chills42    schedule 11.12.2008
comment
Каждый язык, поддерживающий переменные и ветвление, будет иметь аналогичную структуру. Не имеет значения, является ли язык типизированным или нет.   -  person NotMe    schedule 11.12.2008
comment
Крис, это не вопрос ветвящейся структуры. C типизирован, но не имеет логического типа. if (хорошо) отличается от if (good == TRUE). Первое означает, что хорошо не ноль. Второе означает, что хорошее в точности равно ИСТИНА, то есть определенному целочисленному значению. См. Ответ MikeB для получения дополнительной информации.   -  person Jim Nelson    schedule 12.12.2008
comment
Основная проблема, на мой взгляд, в том, что из-за этого разработчик выглядит так, будто он действительно не понимает логические значения.   -  person JoelFan    schedule 13.05.2010


Ответы (41)


Я придерживаюсь того же синтаксиса, что и вы, он менее подробный.

Люди (более новички) предпочитают использовать == true, чтобы быть уверенными, что это то, что они хотят. Они привыкли использовать оператор в своем условном ... они сочли его более читаемым. Но как только вы стали более продвинутыми, вас это раздражало, потому что это было слишком многословно.

person Community    schedule 10.12.2008
comment
Это предпочитают не только новички; любой, кто заинтересован в максимальной читаемости кода, предпочитает его. Какая стоимость? - person Chris; 10.12.2008
comment
Я нашел его более читаемым, чем короче ... какова цель правильно == истина, когда левая сторона уже верна / ложь ... Никому не говори ... Я согласен с Даок, я делал это несколько месяцев назад, чем осознать свою ошибку - person Pokus; 10.12.2008
comment
@litb: Я знаю, что впервые вижу, что голосование идет так быстро: P за последние 20 минут набралось около 15 голосов. Удивительный - person Patrick Desjardins; 10.12.2008
comment
Если вы правильно называете переменные, то добавление оператора фактически снижает удобочитаемость. Т.е. Когда вы читаете, если хорошо, то читать легче, чем если хорошо, то это правда. Я согласен с if (isGood), это настолько ясно, насколько это возможно. - person Marko Dumic; 10.12.2008
comment
@Christopher: если вы не выполняете true == myVar или false == myVar, вы настраиваете себя на незначительные ошибки, такие как if (myVar = true) {}. - person GalacticCowboy; 10.12.2008
comment
Хуже преступника такое имя, как NotInSet ... if (! NotInSet) ????? иногда имя заставляет выбор. - person DGM; 10.12.2008
comment
Меня это не раздражает, но я считаю, что сжатая форма более удобочитаема. Точно так же я предпочитаю избегать префикса Is. Я прочитал !IsGood как "Не хорошо", но я прочитал !Good как "Не хорошо". @DGM верен, важно избегать отрицательной формы в имени переменной, чтобы избежать двойных отрицаний. - person Greg D; 10.12.2008
comment
Чем больше подробностей, тем выше вероятность опечатки. - person Jordan Parmer; 10.12.2008
comment
56 голосов за почти банальное мнение? Ха, этот сайт вышел из-под контроля. - person JC.; 10.12.2008
comment
Я согласен, обычно новички или люди, которые плохо называют свои переменные, предпочитают более длинную версию. - person Stephane Grenier; 10.12.2008
comment
Я всегда использую ==, потому что кому-то слишком легко сделать ошибку, которая случилась со мной более одного раза. Когда я начал это делать, путаница ушла. Я использую то, что облегчает мою жизнь. - person Kenny Mann; 10.12.2008
comment
Мне любопытно посмотреть, сможет ли серьезный ответ набрать 100 голосов. Обычно я вижу это только в вашем лучшем xyz ... - person Patrick Desjardins; 11.12.2008
comment
Когда я вижу == для логических типов, я думаю, что это показатель того, что человек, использующий ==, полностью понимает логическую логику и ее значение. - person Lara Dougan; 16.12.2008

Я всегда хихикаю (или кидаю что-нибудь в кого-то, в зависимости от настроения), когда сталкиваюсь с

if (someBoolean == true) { /* ... */ }

потому что, конечно, если вы не можете полагаться на тот факт, что ваше сравнение возвращает логическое значение, тогда вы также не можете полагаться на сравнение результата с истиной, поэтому код должен стать

if ((someBoolean == true) == true) { /* ... */ }

но, конечно, это действительно должно быть

if (((someBoolean == true) == true) == true) { /* ... */ }

но конечно ...

(ах, компиляция не удалась. Вернемся к работе.)

person Community    schedule 10.12.2008
comment
Оттенки Монти Пайтона и набросок спама ... Мне нужен тест If со спамом, спамом, спамом, истиной и спамом ... - person Ken Ray; 10.12.2008

Я бы предпочел более короткий вариант. Но иногда == false помогает сделать код еще короче:

Для реального сценария в проектах, использующих C # 2.0, я вижу только одну вескую причину для этого: bool? type. Три состояния bool? полезно, и таким образом легко проверить одно из его возможных значений.

На самом деле вы не можете использовать (!IsGood), если IsGood равно bool?. Но писать (IsGood.HasValue && IsGood.Value) хуже, чем (IsGood == true).

Поиграйте с этим образцом, чтобы понять:

bool? value = true; // try false and null too

if (value == true)
{
    Console.WriteLine("value is true");
}
else if (value == false)
{
    Console.WriteLine("value is false");
}
else
{
    Console.WriteLine("value is null");
}

Я только что обнаружил еще один случай, когда if (!IsGood) { ... } не то же самое, что if (IsGood == false) { ... }. Но это нереально;) Здесь может помочь перегрузка оператора :) (и оператор true / false, что AFAIK не рекомендуется в C # 2.0, потому что его предполагаемая цель - обеспечить bool? -Подобное поведение для определяемого пользователем типа, а теперь Вы можете получить его стандартным типом!)

using System;

namespace BoolHack
{
    class Program
    {
        public struct CrazyBool
        {
            private readonly bool value;

            public CrazyBool(bool value)
            {
                this.value = value;
            }

            // Just to make nice init possible ;)
            public static implicit operator CrazyBool(bool value)
            {
                return new CrazyBool(value);
            }

            public static bool operator==(CrazyBool crazyBool, bool value)
            {
                return crazyBool.value == value;
            }

            public static bool operator!=(CrazyBool crazyBool, bool value)
            {
                return crazyBool.value != value;
            }

            #region Twisted logic!

            public static bool operator true(CrazyBool crazyBool)
            {
                return !crazyBool.value;
            }

            public static bool operator false(CrazyBool crazyBool)
            {
                return crazyBool.value;
            }

            #endregion Twisted logic!
        }

        static void Main()
        {
            CrazyBool IsGood = false;

            if (IsGood)
            {
                if (IsGood == false)
                {
                    Console.WriteLine("Now you should understand why those type is called CrazyBool!");
                }
            }
        }
    }
}

Так что ... пожалуйста, осторожно используйте перегрузку операторов :(

person Community    schedule 10.12.2008
comment
(IsGood == true) тоже не будет работать, если IsGood имеет значение типа bool, допускающее значение NULL. Вам нужно будет написать (IsGood.HasValue && IsGood.Value == true), что будет еще более подробным и, возможно, менее понятным, чем (IsGood.HasValue && IsGood.Value) - person Charles Bretana; 10.12.2008
comment
Чарльз, я думаю, вы ошибаетесь. Для Nullable ‹T› вы получите T как тип свойства Value (в нашем случае bool, поэтому (... && IsGood.Value) должно работать). Также вы можете использовать самую короткую форму. Попробуйте поиграть с образцом, который я только что добавил в ответ. - person IgorK; 10.12.2008
comment
IgorK, я согласен, [IsGood.Value] будет работать (если IsGood имеет значение ...) Я говорил, что просто написание IsGood == true не будет работать, если IsGood является Nullable ‹bool› В этом случае IsGood НЕ является bool, это значение Nullable ‹bool›, поэтому вы не можете сравнивать его с true, что приведет к несоответствию типов - person Charles Bretana; 10.12.2008
comment
Чарльз, первый пример работает во всех трех случаях (когда типизированный в IsGood тип bool? Инициализируется значением true, false или null). Я проверил еще раз. Вы хотите сказать, что первый образец не будет компилироваться с использованием компилятора C # 2.0? Это действительно так ... Никаких исключений в нулевом случае тоже :) - person IgorK; 10.12.2008
comment
Я очень сомневаюсь, что попробую сам; p - person Shawn; 10.12.2008
comment
Попробуй, Шон :) У WPF есть свойство IsChecked с bool? введите CheckBox (унаследованный от ToggleButton), и мне пришлось реализовать поведение проверки / снятия отметки в элементе управления деревом, поэтому этот проверяется :) - person IgorK; 10.12.2008
comment
Если вы хотите сделать это, используйте (false == value) вместо (value == false), так как вы можете ошибиться и случайно написать (value = false), что может вызвать или не вызвать предупреждение компилятора. - person mmx; 10.12.2008
comment
mehrdad, я считаю, что многим программистам на C / C ++ нравится эта концепция. В C # очень строгие правила, которые могут быть включены в условие if. Для простого bool это будет работать, но, как уже было сказано, boolVar == false слишком многословен, а для bool? переменная if (boolOptVar = false) просто не компилируется !!! 'причина ошибки CS0266. - person IgorK; 10.12.2008
comment
Мехрдад !!! Вы только что нашли еще одну причину НЕ писать `if (boolVar == false)` - похоже, это реальный случай, когда вы можете повредить значение :) Может быть, есть и другие, но я полагаю, что это возможно только с типами, которые позволяют неявное приведение к типу bool. - person IgorK; 10.12.2008
comment
Я бы предпочел if (IsGood.GetValueOrDefault ()), которые имеют тот же эффект и будут быстрее (время выполнения), чем if (IsGood.HasValue && IsGood.Value). Обратите внимание, что if (! IsGood.GetValueOrDefault ()) НЕ то же самое, что if (IsGood.HasValue &&! IsGood.Value). - person P Daddy; 11.12.2008

Согласно Code Complete, книга Джефф получил свое имя от и с большим уважением относится к следующему способу обращения с логическими значениями.

if (IsGood)
if (!IsGood)

Я обычно сравнивал логические значения, но я понял, зачем добавлять дополнительный шаг в процесс и рассматривать логические значения как второстепенные. На мой взгляд, сравнение возвращает логическое значение, а логический тип уже является логическим, так почему бы просто не использовать логическое значение.

На самом деле дискуссия сводится к использованию хороших имен для ваших логических значений. Как и в предыдущем случае, я всегда формулирую свои логические объекты в ответах на вопрос. Такие как

  • Хорошо
  • HasValue
  • и Т. Д.
person Community    schedule 10.12.2008

Техника тестирования на истинность или ложь определенно является плохой практикой, если рассматриваемая переменная действительно предполагается использовать как логическое значение (даже если ее тип не является логическим) - особенно в C / C ++. Тестирование против true может (и, вероятно, приведет) к незаметным ошибкам:

Эти явно похожие тесты дают противоположные результаты:

// needs C++ to get true/false keywords
// or needs macros (or something) defining true/false appropriately
int main( int argc, char* argv[])
{
    int isGood = -1;

    if (isGood == true) {
        printf( "isGood == true\n");
    }
    else {
        printf( "isGood != true\n");
    }

    if (isGood) {
        printf( "isGood is true\n");
    }
    else {
        printf( "isGood is not true\n");
    }

    return 0;
}

Это отображает следующий результат:

isGood != true
isGood is true

Если вы чувствуете необходимость протестировать переменную, которая используется в качестве логического флага против истины / ложь (что, на мой взгляд, делать не следует), вы должны использовать идиому всегда проверять на ложь, потому что ложь может иметь только одно значение (0 ), в то время как истина может иметь несколько возможных значений (все, кроме 0):

if (isGood != false) ...  // instead of using if (isGood == true)

Некоторые люди будут думать, что это недостаток C / C ++, и это может быть правдой. Но это факт жизни для этих языков (и, вероятно, многих других), поэтому я бы придерживался короткой идиомы, даже в таких языках, как C #, которые не позволяют использовать целое значение в качестве логического.

См. Этот вопрос SO, чтобы увидеть, где эта проблема на самом деле кого-то укусила ...

person Community    schedule 10.12.2008

Я согласен с вами (и меня это тоже раздражает). Я думаю, это просто небольшое недоразумение, что IsGood == true оценивается как bool, что IsGood было изначально.

Я часто вижу такие экземпляры SomeStringObject.ToString().

Тем не менее, для языков, которые более свободны с типами, это может быть оправдано. Но не в C #.

person Community    schedule 10.12.2008
comment
Хороший момент в этом проявляется рядом с String.ToString (), но мне было бы любопытно посмотреть, может ли это быть привычкой для некоторых разработчиков, которые привыкли к языкам, которые более свободны с их типами данных. - person rjzii; 10.12.2008
comment
Верно, что это вычисление до логического значения, с чего вы начали. Где же тогда остановиться? ((isGood == false) == true)? Нет, это тоже bool, (((isGood == false) == true) == true) и так далее ... Сравнение bools с bool означает, что вы делаете это неправильно ...: p - person jalf; 10.12.2008

Некоторые люди считают, что явная проверка известного значения более удобочитаема, поскольку вы можете определить тип переменной, прочитав. Я не уверен, что один лучше другого. Они оба работают. Я обнаружил, что если переменная по своей сути содержит «инверсию», то мне кажется, что я склоняюсь к проверке по значению:

if(IsGood) DoSomething();

or

if(IsBad == false) DoSomething();

вместо

if(!IsBad) DoSomething();

Но опять же, для меня это не имеет большого значения, и я уверен, что в итоге получится тот же ИЛ.

person Community    schedule 10.12.2008
comment
Вот что я делаю. Если я ищу ложь, я делаю == ложь, но стараюсь этого не делать. Я бы предпочел вообще не инвертировать условное выражение. Обычно имеет смысл перефакторить isBad на isGood или поменять местами блоки if / else, чтобы было больше смысла, или что-то еще. - person Adam Jaskiewicz; 10.12.2008
comment
Если вы видите, что (IsGood), вы также можете сделать вывод, что это логическое значение, иначе оно не будет компилироваться! ;) В любом случае, вы правы, новички склонны видеть это понятнее. - person rgargente; 10.12.2008

Только читабельность ..

Во всяком случае, способ, который вы предпочитаете, более эффективен при компиляции в машинный код. Однако я ожидаю, что они производят в точности один и тот же машинный код.

person Community    schedule 10.12.2008

Судя по полученным до сих пор ответам, это похоже на консенсус:

  1. В большинстве случаев лучше всего подходит краткая форма. (IsGood и! IsGood)
  2. Логические переменные следует записывать как положительные. (IsGood вместо IsBad)
  3. Поскольку большинство компиляторов в любом случае выводят один и тот же код, разницы в производительности нет, за исключением интерпретируемых языков.
  4. Этот вопрос без явного победителя, вероятно, можно рассматривать как битву в религиозной войне стиля кодирования.
person Community    schedule 10.12.2008
comment
Я не согласен с тем, что нет явного победителя, особенно в C / C ++. Это не просто проблема стиля, могут быть семантические различия. Использование более длинной формы может вызвать небольшие ошибки. - person Michael Burr; 10.12.2008
comment
Но использование более длинной формы может вызвать небольшие ошибки. if (isGood = false) можно было бы избежать, просто используя ! - person AustinWBryan; 05.06.2018

Я предпочитаю использовать:

if (IsGood)
{
    DoSomething();
}

и

if (IsGood == false)
{
    DoSomething();
}

поскольку я считаю это более читаемым - символ! его слишком легко пропустить (как при чтении, так и при наборе текста); также «if not IsGood, то ...» звучит не совсем правильно, когда я это слышу, в отличие от «if IsGood is false then ...», которое звучит лучше.

person Community    schedule 10.12.2008

Возможно (хотя маловероятно, по крайней мере, я надеюсь), что в коде C ИСТИНА и ЛОЖЬ # определены для вещей, отличных от 1 и 0. Например, программист мог бы решить использовать 0 как «истину» и -1 как «ложь». "в конкретном API. То же самое верно и для унаследованного кода C ++, поскольку «истина» и «ложь» не всегда были ключевыми словами C ++, особенно за день до того, как появился стандарт ANSI.

Также стоит отметить, что некоторые языки - особенно скриптовые, такие как Perl, JavaScript и PHP - могут иметь забавные интерпретации того, какие значения считаются истинными, а какие - ложными. Возможно (хотя, опять же, маловероятно), что «foo == false» означает нечто слегка отличное от «! Foo». Этот вопрос помечен как «агностик языка», и язык может определять оператор == так, чтобы он не работал способами, совместимыми с! оператор.

person Community    schedule 10.12.2008
comment
Также есть тонкое поведение в C / C ++, когда все, что не равно нулю, истинно, но не обязательно == TRUE. - person GalacticCowboy; 10.12.2008

Я видел следующее требование стиля C / C ++.

if ( true == FunctionCall()) {
  // stuff
}

Причина заключалась в том, что если вы случайно поставили «=» вместо «==», компилятор откажется от присвоения значения константе. Между тем, это ухудшает читаемость каждого оператора if.

person Community    schedule 10.12.2008
comment
Я не слежу за этим. Если вам не требуется '==', вы случайно не набираете '=' - person Jimmy; 13.12.2008
comment
Это действительно улучшает читаемость (после привыкания (не занимает много времени)). Всегда рекомендуется ставить более короткий элемент в начале (SomLongFunctionCall(*pointer[3], file == NOFILE, GetMyHeap(1, ALWAYS)) == E_NOERR намного проще для глаз, наоборот: E_NOERR == SomLongFunctionCall(*pointer[3], NOFILE == file, GetMyHeap(1, ALWAYS)). YMMV как обычно. - person bobbogo; 09.03.2011

Иногда его используют с точки зрения удобочитаемости. Иногда именованная переменная или вызов функции могут оказаться дважды отрицательными, что может сбивать с толку, а явное выполнение ожидаемого теста, как это, может улучшить читаемость.

Хорошим примером этого может быть strcmp () C / C ++, который возвращает 0, если строки равны, иначе ‹или> 0, в зависимости от того, где есть разница. Итак, вы часто будете видеть:

if(strcmp(string1, string2)==0) { /*do something*/ }

Однако в целом я согласен с вами, что

if(!isCached)
{
    Cache(thing);
}

легче читать.

person Community    schedule 10.12.2008
comment
Как только вы поймете, что такое strcmp, будет лучше, если (! Strcmp (string1, string2)) {/ * что-то сделать * /} - person David Allan Finch; 10.12.2008
comment
Выполнение! Strcmp хуже, потому что вы смешиваете логические операторы с нелогическими значениями. strcmp == 0 /! = 0 - более правильный и понятный способ. - person Torlack; 10.12.2008
comment
В прошлом у меня были проблемы с strcmp из-за того, что я не совсем понимал, что он возвращает, в основном из-за того, что он в большинстве случаев использовался как! Strcmp (). В целом я считаю, что написать == 0 не намного сложнее, и это совершенно ясно дает понять, чего вы от него ожидаете. - person xan; 11.12.2008
comment
Обычно я использую встроенную функцию или макрос isEqual, который вызывает! Strcmp. Фактически, в моем коде на C ++ я теперь использую класс-оболочку char *, называемый cStrBuff, который имеет служебные функции и операторы. - person David Allan Finch; 11.12.2008
comment
Подобно strcmp, если не логическая переменная тестируется логическим способом, как здесь: if (count) {count--;}, мне всегда требуется дополнительное время, чтобы понять, что count не является логическим, и мы тестируем что-то еще здесь . - person Purple Tentacle; 09.11.2010

Я предпочитаю подход ! IsGood и думаю, что большинство людей, знающих язык программирования c-style, тоже предпочтут его. Я только догадываюсь, но думаю, что большинство людей, которые пишут IsGood == False, пришли из более подробного языкового фона, такого как Visual Basic.

person Community    schedule 10.12.2008
comment
тем более, что в Visual Basic Not IsGood более читабелен, чем IsGood = False - person Jimmy; 10.12.2008

Единственное, что хуже

if (true == IsGood) {....

Никогда не понимал мысли, стоящей за этим методом.

person Community    schedule 10.12.2008
comment
Думаю, это из C ++. Если вы сделаете ошибку и напишете if (x = 6), эту ошибку будет очень сложно найти, тогда как if (6 = x) приведет к ошибке компиляции. - person gius; 10.12.2008
comment
Как только вы привыкнете на нее смотреть, читать ее не составит труда. Что-то вроде привычки читать по-английски? - person Diastrophism; 11.12.2008
comment
Ненавижу это видеть. Вы бы не сказали, что красный был цветом машины, если только вы не говорите глубоко или вычурно. Можно просто сказать, машина красного цвета. - person AustinWBryan; 05.06.2018

Шаблон !IsGood легче найти, чем IsGood == false при преобразовании в регулярное выражение.

/\b!IsGood\b/

vs

/\bIsGood\s*==\s*false\b/
/\bIsGood\s*!=\s*true\b/
/\bIsGood\s*(?:==\s*false|!=\s*true)\b/
person Community    schedule 10.12.2008

Для удобства чтения вы можете рассмотреть свойство, которое зависит от другого свойства:

public bool IsBad => !IsGood;

Тогда вы действительно сможете понять смысл:

if (IsBad)
{
    ...
}
person Community    schedule 10.12.2008
comment
На самом деле это одна из моих любимых головокружений. Где-то по ходу дела меня учили, что логические значения должны представлять положительные условия. Использование отрицательных условий неизбежно приводит к странным двойным отрицательным результатам, например, if (! IsBad ||! Uninitialized), превращая мозг разработчика в мягкий крендель. - person benjismith; 10.12.2008
comment
Но если у вас есть следствия IsGood и IsBad, то вам никогда не придется делать что-то вроде! IsBad - person Brian Genisio; 10.12.2008
comment
Если вам нравятся исключения переполнения стека ... public bool IsBad {get {return! IsGood; }} public bool IsGood {get {return! IsBad; }} - person GalacticCowboy; 10.12.2008
comment
Что, если вы забыли, что IsBad - это собственность или что-то в этом роде? !IsGood следует читать как Is not Good, поэтому он встроен - person AustinWBryan; 05.06.2018

Я предпочитаю !IsGood, потому что для меня это более понятно и логично. Однако проверяю, является ли boolean == true избыточным, поэтому я бы этого избегал. Хотя синтаксически я не думаю, что есть разница в проверке IsGood == false.

person Community    schedule 10.12.2008
comment
Я думаю, вы имеете в виду «семантически». Строго говоря, между ними есть разница, потому что используемые операторы (в том числе false) можно переопределить. Также (в зависимости от вашего уровня семантики) оба описывают разные оценки (хотя компилятор, скорее всего, использует одно и то же для обоих). - person mweerden; 10.12.2008

Во многих языках разница заключается в том, что в одном случае компилятор / интерпретатор диктует значение true или false, а в другом случае это определяется кодом. C - хороший тому пример.

if (something) ...

В приведенном выше примере «что-то» сравнивается с определением компилятора «истина». Обычно это означает «не ноль».

if (something == true) ...

В приведенном выше примере «что-то» сравнивается с «истиной». Как тип «истина» (и, следовательно, сопоставимость), так и значение «истина» могут определяться языком и / или компилятором / интерпретатором, а могут и не определяться.

Часто это не одно и то же.

person Community    schedule 10.12.2008

Ты забыл:

если (IsGood == FileNotFound)

person Community    schedule 10.12.2008

Мне кажется (хотя у меня нет доказательств, подтверждающих это), что люди, которые начинают с языков типа C # / java, предпочитают метод «if (CheckSomething ())», в то время как люди, начинающие с других языков (C ++: в частности, Win32 C ++) по привычке используют другой метод: в Win32 «if (CheckSomething ())» не будет работать, если CheckSomething вернет BOOL (вместо bool); и во многих случаях функции API явно возвращают значение 0/1 int / INT, а не значение true / false (что и есть BOOL).

Я всегда использовал более подробный метод, опять же по привычке. Синтаксически они одинаковы; Я не верю в ерунду "многословие меня раздражает", потому что не программист должен впечатляться кодом (компьютер делает). И в реальном мире уровень навыков любого человека, смотрящего на написанный мной код, будет разным, и у меня нет времени или желания объяснять особенности оценки утверждений тому, кто может не понимать немного неважного. такие биты.

person Community    schedule 10.12.2008
comment
Компилятор ничего не говорит о коде. Программист (и, что более важно, более поздние программисты) должен быть впечатлен. Вы можете отбросить все правила форматирования и стиля, и компилятор не будет беспокоиться, но моральный ущерб для любого, кто читает код, будет огромным. - person Diastrophism; 11.12.2008

Ах, у меня есть сотрудники, которые отдают предпочтение более длинной форме, утверждая, что она более читабельна, чем крошечная!

Я начал "исправлять" это, поскольку логические значения самодостаточны, тогда я отказался от крестового похода ... ^ _ ^ В любом случае они не любят очищать код, утверждая, что это затрудняет интеграцию между ветвями (это правда, но тогда вы живете вечно с плохо выглядящим кодом ...).

Если вы правильно напишете имя логической переменной, оно должно читаться естественно:
if (isSuccessful) vs. if (returnCode)

В некоторых случаях я могу использовать логическое сравнение, например:
if (PropertyProvider.getBooleanProperty(SOME_SETTING, true) == true), потому что оно читается менее "естественно".

person Community    schedule 10.12.2008

Почему-то мне всегда нравилось

if (IsGood)

больше, чем

if (!IsBad)

и поэтому мне нравится Ruby, только если (но злоупотреблять им слишком легко):

unless (IsBad)

и даже больше, если использовать вот так:

raise InvalidColor unless AllowedColors.include?(color)
person Community    schedule 10.12.2008

Cybis, при кодировании на C ++ вы также можете использовать ключевое слово not. Это часть стандарта с давних пор, поэтому этот код вполне допустим:

if (not foo ())
   bar ();

Изменить: Кстати, я забыл упомянуть, что стандарт также определяет другие логические ключевые слова, такие как и (&&), bitand (&), или (||), bitor (|), xor (^) ... Они называются операторными синонимами.

person Community    schedule 10.12.2008
comment
Ты узнаешь что-то новое каждый день. Я прочитал ТОННУ статей, руководств, книг по C ++, прошел уроки по C ++ в университете, но никогда раньше не видел этот синтаксис. Спасибо. - person Cybis; 11.12.2008
comment
Это должно было произойти, когда этот парень из VB присоединился к комитету по стандартам C ++! - person P Daddy; 11.12.2008
comment
@P Daddy: да, еще в 1980-х, когда Бьярн Страуструп разрабатывал C ++, он позаимствовал машину времени Кнута, чтобы переместиться в 90-е, когда люди возятся с программистами VB. Или, может быть, вы никогда не слышали об ALGOL. - person Aaron; 11.12.2008

Если вы действительно считаете, что вам нужно:

if (Flag == true)

тогда, поскольку условное выражение само является логическим, вы, вероятно, захотите расширить его до:

if ((Flag == true) == true)

и так далее. Сколько еще гвоздей нужно этому гробу?

person Community    schedule 30.10.2009

Если вы работаете с Perl, у вас есть возможность

unless($isGood)
person Community    schedule 30.10.2009
comment
Это кажется менее идеальным, чем !isGood - person AustinWBryan; 05.06.2018

Я не использую ==, но иногда использую !=, потому что это более ясно для меня. НО в моей работе мы не используем != или ==. Мы пытаемся получить имя, которое значимо с hasXYZ() или isABC().

person Community    schedule 11.12.2008

Лично я предпочитаю форму, о которой дядя Боб говорит в Чистом коде:

(...)
    if (ShouldDoSomething())
    {
        DoSomething();
    }
(...)

bool ShouldDoSomething()
{
    return IsGood;
}

где условные обозначения, кроме самых тривиальных, помещаются в функции предикатов. Тогда менее важно, насколько удобочитаема реализация логического выражения.

person Community    schedule 10.12.2008
comment
Я не хочу идти куда-то еще, чтобы понять, что означает ShouldDoSomething. - person Randy Stegbauer; 10.12.2008
comment
Я не согласен с приведенным выше комментарием. Обычно думают в терминах рабочего процесса, который во многих случаях важнее, чем сама реализация условия. - person Mauli; 11.12.2008
comment
Моя точка зрения в точности. Если вы учитываете количество умственных способностей, затрачиваемых при просмотре кода, вы экономите немного, когда вас не беспокоят слишком многие детали. - person mookid8000; 11.12.2008
comment
Если тело оператора просто делает что-то, зачем вам нужно условие, если должно что-то делать ... это очевидно. Я думаю, что в этом нет необходимости, если только в другом месте не используется такое же условие. - person Connell; 16.07.2012
comment
Это глупо. Зачем бросать в стек другую функцию только для того, чтобы вернуть единственную переменную, которую можно было бы использовать напрямую? Поскольку это простой метод, вы можете сделать его свойством только get, но это просто вернет IsGood, так что вы можете просто использовать его напрямую и не заставлять читателя беспокоиться, если ShouldDoSomething является каким-то дорогим методом - person AustinWBryan; 05.06.2018
comment
Да ладно, во-первых, я думаю, вы пропустили (...) кроме самых тривиальных (...) частей. Более того, ваше предложение об использовании свойства будет иметь те же накладные расходы времени выполнения, что и метод, потому что свойства ЯВЛЯЮТСЯ методами. Напоследок: не волнуйтесь, будьте счастливы :) - person mookid8000; 06.06.2018

Здесь мы делаем следующее:

if(IsGood)

or

if(IsGood == false)

Причина этого в том, что у нас есть устаревший код, написанный парнем, которого больше нет (в Delphi), который выглядит так:

if not IsNotGuam then

Это причиняло нам много боли в прошлом, поэтому было решено, что мы всегда будем стараться проверять положительные моменты; если это было невозможно, сравните отрицательный результат с ложным.

person Community    schedule 10.12.2008

Единственный раз, когда я мог подумать, где имел смысл более веб-код, был в Visual Basic до .NET, где true и false на самом деле были целыми числами (true = -1, false = 0), а логические выражения считались ложными, если они оценивались как ноль и истина для любых других ненулевых значений. Итак, в случае старого VB два перечисленных метода на самом деле не были эквивалентными, и если вы хотели, чтобы что-то было правдой, только если оно оценивается как -1, вам нужно было явно сравнить с «истиной». Таким образом, выражение, которое оценивается как «+1», будет истинным, если оценено как целое число (потому что оно не равно нулю), но оно не будет эквивалентно «истинному». Я не знаю, почему VB был разработан таким образом, но я вижу много логических выражений, сравнивающих переменные с истиной и ложью в старом коде VB.

person Community    schedule 10.12.2008

Хотя это не практическая разница, я всегда рассматриваю == как числовой оператор, и как таковой он не применим к логическим типам. Ближайшим логическим оператором является «эквивалентность» (не исключающее или), для которого нет оператора в стиле C.

Таким образом, строго логический тест становится

if (!(IsGood ^ true))

В качестве иллюстрации проблем с числовыми операторами над логическими значениями, что такое логическое вычисление

true / 2
person Community    schedule 10.12.2008
comment
Насколько мне известно, '^' в стиле C обычно является числовым оператором (то есть побитовым xor). Фактически, C-подобные языки часто не имеют логических значений. Обратите внимание, что! B на этих языках эквивалентно b == 0. (Кроме того, с алгебраической точки зрения это вообще не проблема.) - person mweerden; 10.12.2008
comment
Если вы используете Python 3.0, True / 2 оценивается как True. Если Python 2.X, True / 2 оценивается как False. В чем разница, оставлено читателю в качестве упражнения. :) - person J.T. Hurley; 11.12.2008
comment
== не является числовым оператором. Вы также можете использовать его с логическими типами, по крайней мере, в C ++. Таким образом, вы можете написать if (oneBool == anotherBool) ... - person Daniel Daranas; 18.05.2009

В некоторых случаях это действительно полезно, хотя и не часто.

Вот пример. В ActionScript 2 логические значения имеют 3 возможных значения:

  • истинный
  • ложный
  • null / undefined

Обычно я делаю что-то подобное в методах, которые принимают необязательные логические аргументы:

function myFunc(b:Boolean):Void {
  if(b == true) {
    // causes b to default to false, as null/undefined != true
  }
}

OR

function myFunc(b:Boolean):Void {
  if(b != false) {
    // causes b to default to true, as null/undefined != false
  }
}

в зависимости от того, что я хочу установить по умолчанию. Хотя, если мне нужно использовать логическое значение несколько раз, я сделаю что-то вроде этого:

function myFunc(b:Boolean):Void {
  b = (b == true); // default to false
}

OR

function myFunc(b:Boolean):Void {
  b = (b != false); // default to true
}
person Community    schedule 10.12.2008

Я думаю, это действительно зависит от языка.

Скажем, в PHP некоторые функции могут либо возвращать false, либо возвращать неотрицательные числа.

Тогда:

if(foo(bar)) { ... }

схема не будет работать слишком хорошо, потому что вы не можете отличить от возврата false или 0.

На других языках, в которых нет этого мерзкого маленького FUBAR, я думаю, что любая форма приемлема.

person Community    schedule 10.12.2008

Один размер не подходит всем. Иногда более краткую форму можно сделать простой или идиоматической, например! (X% y), которая возвращает «Истина», если y является множителем x.

В других случаях более подробное сравнение было бы более полезным. [(x, y) для x в диапазоне (10) для y в диапазоне (10), если нет (x и y)] не так просто, как [(x, y) для x в диапазоне (10) для y в диапазоне (10) если (x == 0 или y == 0)]

person Community    schedule 11.12.2008

Мне нравится использовать разные стили в зависимости от наименования переменных, например:

Переменные, названные с префиксом, например Is, Has и т. Д., С которыми, глядя на имя, очевидно, являются логическими, которые я использую:

if(IsSomething)

но если у меня есть переменные, у которых нет такого префикса, я бы предпочел использовать

if(Something == true)

Какую бы форму вы ни использовали, вы должны решить, основываясь на языке программирования, на котором вы ее используете. Значение

if(Something) and if(Something == true)

могут иметь очень разное значение на разных языках программирования.

person Community    schedule 13.12.2008

Можно утверждать, что проверка типа if isValidDate == true может привести к чрезмерному вложению. Рассмотрим блок кода, который проверяет, что у нас есть действительные данные от пользователя, например:

if (isValidDate == true) {
    if (isValidQuantity == true) {
         if (isOtherThingValid == true) {
              bool result = doThing();
              if (result == true) {
                   thatWorked();
         } // long block of code that tries to compensate for OtherThing's invalidness
    } // obtuse function call to a third party library to send an email regarding the invalid quantity
} // is this the function close brace or the if...

Это сводит меня с ума, отчасти поэтому я выработал привычку делать все наоборот:

if (isValidDate == false) {
    logThisProblem("Invalid date provided.");
    return somethingUseful;
}

if (isValidQuantity == false) {
    logThisProblem("Invalid quantity provided.");
    return somethingUseful;
}

if (isOtherThingValid == false) {
    logThisProble("Other thing not valid.");
    return somethingUseful;
}

// OK ... we've made it this far...
bool result = doThing(date, quantity, otherThing);
person Community    schedule 16.10.2009
comment
Это правда, но вы все равно можете сказать: if (! IsValidDate) {вместо if (isValidDate == false) { - person chills42; 16.10.2009

На таком языке, как C, где нет "логического" типа, я рекомендую более длинный путь, т.е.

if (is_good == True)
{
}

Причина в том, что is_good не только _2 _ / _ 3_ (скорее всего, реализовано как char) и, следовательно, может быть повреждено другими значениями или неправильно установлено.

Так что в этом хорошего? Ваш код сможет выявить любые проблемы, связанные с неправильной установкой is_good, потому что без проверки == True или == False все пойдет на истину;) И если вы действительно имеете в виду логическое значение, то это плохо.

person Community    schedule 12.12.2008

Пока у нас есть if (isGood) или if (!isGood), все в порядке.

Иногда мне попадается такой код ...

if (!getGreatGrandFateher.getGrandFather().getFather().getFirstChild().isMale())
{
   doSomething();
}

На первый взгляд это вводит в заблуждение, что doSomething вызывается, если это Male. Маленький '!' после "if" теряется в большой конструкции кода, подобной приведенной выше.

Явная проверка, как показано ниже, обеспечивает лучшую читаемость

if(getGreatGrandFateher.getGrandFather().getFather().getFirstChild().isMale() == false)
{
   doSomething();
}
person Community    schedule 11.12.2008
comment
Этот код слишком подвержен ошибкам даже при использовании синтаксиса '== false'. Я надеюсь, что вы не слишком часто встречаетесь с таким кодом или что вы его полностью переписываете. - person Troels Thomsen; 10.02.2009
comment
Во-первых, ваш код никогда не должен выглядеть так. - person AustinWBryan; 05.06.2018

Эти две формы семантически идентичны и производят один и тот же машинный код, так почему бы не использовать более читаемую?

if (IsGood == false) лучше, чем if(!IsGood).

При сканировании кода легко ошибиться со знаком "!" перед переменной bool для символа в переменной bool.

person Community    schedule 10.12.2008

Кодирование на C # / C ++ / Java / и т. Д. Я всегда предпочитаю

if (something == true)
if (something == false)

над

if (something)
if (!something)

потому что восклицательный знак сложно увидеть с первого взгляда, если я не использую крупный шрифт (но тогда я бы увидел меньше кода на странице - не все из нас могут позволить себе мониторы с диагональю 24 дюйма и выше). Мне особенно не нравится, когда я непоследовательны и используют if (something) и if (something == false)

Однако когда я кодирую на Python, я почти всегда предпочитаю

if something:
if not something:

потому что «не» ясно видно.

person Community    schedule 10.12.2008
comment
В python «if something:» и «if something == True:» означают разные вещи. В C ++ значение true может неявно преобразовываться в 1, поэтому если 'something' будет целым числом, содержащим значение 2, тогда 'something == true' будет ложным, но '(! Something) == true' также будет false! - person Aaron; 11.12.2008
comment
Я знаю, что технически это иначе, но я имею в виду логические переменные. if isGood :, или если не isGood :. Но ваше право, эта идиома не сработает, если мне нужно отличить None, например, от пустого списка. Однако я стараюсь этого не делать. - person Cybis; 11.12.2008

я буду

if (isGood) {
  doSomething();
}

и

if (isNotGood) {
    doSomethngElse();
}

Читает лучше.

person Community    schedule 16.10.2009