Вложено, если проверить, что указатель действителен, тогда проверить значение - PullRequest
0 голосов
/ 19 декабря 2011

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

Обычно ли это иметь кусок кода, который работает следующим образом:

bool failed = false;
if (ptr)
{
    if (ptr->value == foo)
    {
        print("error");
        failed = true;
    }
}
if (!failed)
{
    print("all systems go");
}

Или это можно сделать без bool? Я думаю, что первые два if могут быть в одной строке, но я не уверен, в каком порядке они проверяются в разных средах, и я думаю, что это может затруднить чтение.

Ответы [ 6 ]

2 голосов
/ 19 декабря 2011

Вы можете написать свое условие следующим образом:

if (ptr && ptr->value == foo)
{
    print("error");
}
else
{
    print("all systems go");
}

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

2 голосов
/ 19 декабря 2011

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

const bool failed = (ptr != NULL) && (ptr->value == foo);

Это не будет оценивать вторую часть, если первая (ptr != NULL) оценивается как ложная.

1 голос
/ 19 декабря 2011

Если позже вам не нужен failed логический код, этот код делает то же самое.

if (ptr && ptr->value == foo) {
    print("error");
} else {
    print("all systems go");
}

Порядок проверок в операторе if четко определен, а && -оператор пропускает второе сравнение ptr->value=foo, если первое выражение неверно.

1 голос
/ 19 декабря 2011

В этом случае вы, безусловно, можете сделать следующее:

if (ptr && (ptr->value == foo) )
{
    print("error");
}
 else
{
    print("all systems go");
}

Вам гарантируется, что логическое И и логическое ИЛИ будут оцениваться слева направо, и что оценка остановится, когда станет известен результат.Так что это безопасно.

0 голосов
/ 19 декабря 2011

Все компиляторы должны следовать одному и тому же порядку приоритета , поэтому проверку можно заменить следующим:

if (ptr && ptr->value == foo)
{
    print("error");
    failed = true;
}

Если первая часть (единственный ptr) имеет значение false,тогда остальная часть выражения не будет оценена.Это называется коротким замыканием.

0 голосов
/ 19 декабря 2011

вы можете просто написать if(ptr && ptr->value == foo')

C гарантирует, что если первое условие не будет выполнено, второе условие вообще не будет проверяться.Это потому, что ЛОЖЬ И НИЧЕГО == ЛОЖЬ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...