Является ли `x--> 0 && array [x]` четким поведением в C ++? - PullRequest
11 голосов
/ 28 октября 2010

Могу ли я использовать x с обеих сторон логического выражения при его последующем увеличении на левой стороне?

Строка, о которой идет речь:

 if(x-- > 0 && array[x]) { /* … use x … */ }

Этоопределяется через стандарт?Будет ли массив [x] использовать новое значение x или старое?

Ответы [ 2 ]

13 голосов
/ 28 октября 2010

Это зависит.

Если && является обычным логическим оператором короткого замыкания, то это нормально, потому что есть точка последовательности.array[x] будет использовать новое значение.

Если && является пользователем (или библиотекой), определенным перегруженным оператором, то нет короткого замыкания, а также нет гарантии точки последовательности между оценкойx-- и оценка array[x].Это выглядит маловероятным, учитывая ваш код, но без контекста невозможно сказать наверняка.Я думаю, что возможно, с тщательным определением array, расположить его таким образом.

Вот почему почти всегда плохая идея перегрузить operator&&.

Кстати,if ((x > 0) && array[--x]) имеет очень похожий эффект (опять же, при условии, что оператор не перегружает махинации), и, на мой взгляд, более понятен.Разница в том, будет ли x уменьшен после 0, на что вы можете положиться или не положиться.

11 голосов
/ 28 октября 2010

Да, это хорошо определено.&& вводит точку последовательности.

...