В C ++ и C # многократные проверки условий выполняются в заранее определенной или случайной последовательности? - PullRequest
7 голосов
/ 08 мая 2009

Ситуация: проверка состояния в C ++ или C # по многим критериям:

if (condition1 && condition2 && condition3)
{
    // Do something
}

Я всегда считал, что последовательность выполнения этих проверок не гарантируется. Таким образом, это не обязательно сначала условие 1, затем условие 2 и только затем условие 3. Я узнал это в свое время с C ++. Я думаю, что мне сказали это или где-то читали.

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

if ((object != null) && (object.SomeFunc() != value))
{
    // A bad way of checking (or so I thought)
}

Итак, я писал:

if (object != null)
{
    if (object.SomeFunc() != value)
    {
        // A much better and safer way
    }
}

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

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

Я очень удивлен. Это действительно так для языков C ++ и C #?

Кто-нибудь еще слышал версию, которую я слышал раньше?

Ответы [ 4 ]

14 голосов
/ 08 мая 2009

Короткий ответ слева направо с оценкой короткого замыкания. Порядок предсказуем.

// perfectly legal and quite a standard way to express in C++/C#
if( x != null && x.Count > 0 ) ...

Некоторые языки оценивают все в условии перед ветвлением (например, VB6).

// will fail in VB6 if x is Nothing. 
If x Is Not Nothing And x.Count > 0 Then ...

Ссылка: MSDN Операторы C # и их порядок или приоритет.

2 голосов
/ 08 мая 2009

Они определены для оценки слева направо, и , чтобы прекратить оценку, когда один из них оценивается как ложный. Это верно как для C ++, так и для C #.

0 голосов
/ 08 мая 2009

Они должны выполняться слева направо. Это позволяет выполнять оценку короткого замыкания.

См. Статью Википедии для получения дополнительной информации.

0 голосов
/ 08 мая 2009

Я не думаю, что есть или был другой путь. Это было бы похоже на то, что компилятор решил запускать операторы не по порядку без причины. :) Теперь некоторые языки (например, VB.NET) имеют разные логические операторы для короткого замыкания, а не короткого замыкания. Но порядок всегда хорошо определен во время компиляции.

Вот приоритет оператора из спецификации языка C #. Из спецификации ...

За исключением операторов присваивания, все бинарные операторы левоассоциативный, что означает, что операции выполняются слева направо право. Например, x + y + z оценивается как (x + y) + z.

...