Какая сторона (слева или справа) оператора && (и) оценивается в C ++ - PullRequest
8 голосов
/ 20 января 2010

В каком порядке оценивается оператор & &&

Например, следующий код

if (float alpha = value1-value2 && alpha > 0.001)
    //do something

сгенерировал исключение, что альфа используется без инициации. Я думал, что выражение слева от && всегда будет сначала вызывать значение альфа, но, похоже, я ошибаюсь

Есть идеи?

Спасибо

Ответы [ 14 ]

0 голосов
/ 20 января 2010

Согласно: http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B

- LtR
> LtR
&& LtR
= RtL

учитывая ваш пример

(int alpha = value1-value2 && alpha > 0.001)
(int alpha = (value1-value2) && alpha > 0.001)
(int alpha = (value1-value2) && (alpha > 0.001))
(int alpha = (value1-value2) && (alpha > 0.001))
(int alpha = ((value1-value2) && (alpha > 0.001)))
0 голосов
/ 20 января 2010

Вот статья , перечисляющая приоритет оператора и ассоциативность .

Из того, что я могу сказать, ваша цель - объявить временное значение, присвоить ему значение value1-value2, затем проверить результат и ввести блок if, если он больше некоторого значения. alpha объявляется как int, но вы, кажется, сравниваете его с двойным. альфа должна быть двойной.

Твое творчество с использованием временных. Ясно, часто лучше, чем мило. Сделайте это вместо:

double alpha = value1-value2;
if (alpha > 0.001)
0 голосов
/ 20 января 2010

Я предполагаю, что это потому, что вы объявляете хранилище внутри оператора "if". Я даже не думал, что это скомпилируется.

Попробуйте это.

int alpha;
if ((alpha=value1-value2) && alpha>0.001)

Но я не думаю, что это делает то, что вам нужно. У вас есть альфа как int, и вы сравниваете ее со значением с плавающей точкой. Первая часть оператора && будет возвращать true, если альфа не равна нулю, а вторая часть возвращает true, если альфа больше 0. Поэтому вам, вероятно, следует сделать это

int alpha;
if ((alpha=value1-value2)>0)

или для более читабельного кода

int alpha=value1-value2
if (alpha>0)

Но чтобы ответить на ваш первоначальный вопрос: && выполняется слева направо и замыкается, когда ответ очевиден. То есть, если первая часть && неверна, вторая даже не оценена!

0 голосов
/ 20 января 2010

Проблема в том, что оператор оценивается так:

if (int alpha = (value1-value2 && alpha > 0.001))

Используйте скобки, чтобы исправить левую и правую части оператора &&:

if ((int alpha = value1-value2) && (alpha > 0.001))

...