C++ полагается на неявное преобразование в bool в условиях?

List<string> strings = new List<string>() { "ABC", "DEF", "GHI" };
string s = strings.Aggregate((a, b) => a + ',' + b);
6
задан moala 25 August 2009 в 22:05
поделиться

8 ответов

В самом строгом смысле вы можете полагаться на неявное преобразование в bool. Этого требует обратная совместимость с C.

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

11
ответ дан 8 December 2019 в 12:21
поделиться

В большинстве случаев это не ужасно, но может быть более читабельным, если вы напечатаете именно то, что имеете в виду.

5
ответ дан 8 December 2019 в 12:21
поделиться

Это правило связывает вас, если вы когда-нибудь захотите использовать класс с неявным преобразованием в bool , например std :: istream . Этот код считывает слово за раз из файла до тех пор, пока не будет достигнут EOF:

std::ifstream file("foo.txt");
std::string word;

while (file >> word)
{
    // do stuff
}

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

Для типов указателей это не имеет большого значения. Компилятор, вероятно, создаст примерно такой же код для неявного преобразования в bool и явного теста на NULL . Тут дело вкуса - ни один из них не "лучше". в абсолютном смысле. Стандарт кодирования просто пытается обеспечить согласованный стиль.

Имея это в виду, вы должны полностью следовать стандарту кодирования при работе со встроенными типами (указатели, целые числа и т. Д.). Если вы столкнетесь с ситуацией, аналогичной описанной выше, с классом, имеющим законное преобразование в bool , я подниму этот вопрос перед вашими товарищами по команде.

4
ответ дан 8 December 2019 в 12:21
поделиться

Иногда мне кажется, что это правило может быть нарушено, например, при работе со стандартными библиотеками, которые возвращают int вместо bool (для совместимости с C89).

Однако это правило обычно приводит к упрощению понимания кода. Это правило применяется даже в таких языках, как C #, и там не слишком много жалоб на него, поэтому нет серьезных недостатков в следовании этому правилу, кроме необходимости к нему привыкать.

1
ответ дан 8 December 2019 в 12:21
поделиться

Это никак не повлияет на скомпилированный код.

Что касается его полезности is - это, безусловно, поможет понять людям, пришедшим с таких языков, как Java / C #. Это сделает более ясным то, что вы проверяете. Это' выдает предупреждение, если вы начинаете сравнивать целые числа с NULL (и тем самым указывать, что вы не уверены в типе рассматриваемой переменной). Я лично предпочитаю первую форму, но это не совсем необоснованное требование.

1
ответ дан 8 December 2019 в 12:21
поделиться

Правило, которое не добавляет никакой выгоды, - это правило, которое вы можете с пользой удалить.

-2
ответ дан 8 December 2019 в 12:21
поделиться

Мне это правило очень не нравится. В C ++ идиоматично использовать неявное преобразование в bool для типов указателей (и, конечно, для логических типов). ИМО, читать

bool conditionMet = false;

while (!conditionMet) // read as "while condition is not met"
{
    /* do something */
}

намного легче, чем читать это:

bool conditionMet = false;

while (conditionMet == false) // read as "while conditionMet is false"
{
    /* do something */
}

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

0
ответ дан 8 December 2019 в 12:21
поделиться

Это впечатляюще глупое правило.

if (ptr != NULL) // ok

тогда почему бы не

 if ((ptr != NULL)==true) 
-4
ответ дан 8 December 2019 в 12:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: