Хорошо, я немного смущен, чтобы задать этот вопрос, но я просто хочу быть уверенным...
Известно, что C использует оценку короткого замыкания в булевых выражениях:
int c = 0;
if (c && func(c)) { /* whatever... */ }
В этом примере func(c)
не вызывается, потому что c
имеет значение 0
. Но как насчет более сложного примера, когда побочные эффекты сравнения изменили бы следующую переменную? Вот так:
int c; /* this is not even initialized... */
if (canInitWithSomeValue(&c) && c == SOMETHING) { /*...*/ }
Функция canInitWithSomeValue
возвращает значение true и изменяет значение при заданном указателе в случае успеха. Гарантировано ли, что последующие сравнения (c == SOMETHING
в этом примере) используют значение, заданное canInitWithSomeValue(&c)
?
Независимо от того, насколько сложны оптимизаторы, используемые компилятором?