Поскольку &&
имеет более высокий приоритет, чем ||
, ваше выражение анализируется как (var1 && bool1) || (bool2 && var1->DoSomething())
.Теперь, поскольку var1
является нулевым указателем, оценка короткого замыкания означает, что bool1
не оценивается, а левая часть ||
оценивается как ложная.Таким образом, чтобы узнать значение выражения, необходимо оценить правую часть (т. Е. При оценке короткого замыкания не здесь!).Правая часть ||
равна bool2 && var1->DoSomething()
, поэтому, если bool2
истинно, var1->DoSomething()
будет оцениваться.Также обратите внимание, что даже для var1
не ноль, результат выражения не всегда будет тем, что вы, вероятно, ожидали.