Размотайте , R и другие объяснили, что на самом деле происходит.Итак, позвольте мне добавить:
Предпосылка вашего вопроса ошибочна.Тот факт, что &&
имеет более высокий приоритет, не означает, что операнды, которые его окружают, должны оцениваться перед любыми операндами в выражении с более низким приоритетом.Даже если в особом случае короткое замыкание ||
и &&
это не обязательно будет так.
Например, рассмотрим a=b+c+d*e
;*
имеет более высокий приоритет, чем +
, но это не означает, что d*e
должен быть оценен до b+c
.Это просто означает, что он должен быть оценен, прежде чем мы добавим продукт к выражению в целом.Компилятор может оценить это выражение как temp1=d*e
, temp2=b+c
, a=temp1+temp2
или может вычислить temp1=b+c
, temp2=d*e
, a=temp1+temp2
.Оба будут одинаково действительны.
При коротком замыкании ||
и &&
существуют некоторые дополнительные ограничения на порядок оценки.
В качестве стороныпримечание: в общем, я бы не стал писать такой код.Я легко могу видеть другого программиста, пытающегося прочитать этот код, который запутывается только в том, когда приращения произойдут, а когда нет.Ну, может быть, если бы вы использовали реальные имена переменных, это не выглядело бы так странно.
Я иногда полагаюсь на короткое замыкание, предотвращающее побочные эффекты.Как
if (!eof() && readNextInt()>0)
Я полагаюсь на короткое замыкание, чтобы предотвратить чтение, если мы уже находимся в конце файла, или
if (confirmDelete==YES && deleteEntry()!=-1)
Я полагаюсь на первый тестна короткое замыкание на ложь, поэтому я не делаю удаление, когда я не должен.Но эти примеры кажутся мне довольно простыми, я надеюсь, что любой компетентный программист увидит, что я делаю.Но когда примеры становятся загадочными, я думаю, что это нужно разбить.Рассмотрим
if (customerType==RETAIL || lastDepositAmount()>100.00)
Если у lastDepositAmount()
был побочный эффект, то, если customerType
в рознице, этот побочный эффект никогда не произойдет.Я не думаю, что это будет очевидно для читателя.(Отчасти потому, что имя функции подразумевает, что она извлекает данные и не выполняет никаких обновлений, а отчасти потому, что нет очевидной связи между типом клиента и суммой депозита - это звучит как две независимые вещи.) Правда, этосубъективны.Но если вы сомневаетесь, выбирайте простоту и ясность, а не тривиальное улучшение производительности.Всегда выбирайте простоту и ясность вместо «эй, это круто, использование неясной функции, любой, кто читает это, будет поражен тем, насколько я должен быть умным, чтобы достаточно хорошо понимать язык, чтобы делать это» .