C: есть ли ленивые вычисления при использовании оператора &&, как в C++?

Я хотел бы знать, правильно ли это выглядит:

while((next !=NULL) && (strcmp(next->name, some_string) < 0) {
    //some process
}

Я имею в виду, что если next равен NULL, то вторая часть выражения никогда не будет проверяться компилятором? Я слышал, что в C++ это так (но я даже не уверен в этом).

Может ли кто-нибудь подтвердить мне, что я не буду получать странные ошибки на некоторых компиляторах с этим?


person Pac0    schedule 18.10.2010    source источник
comment
@Sean: Тестирование не обязательно гарантируется стандартом.   -  person Oliver Charlesworth    schedule 18.10.2010
comment
Кстати, это не всегда верно в C++. Выражение: (next != NULL) может использовать перегруженный оператор != для любого типа next. Этот оператор может возвращать другой тип, для которого && перегружен. А для перегруженного && встроенного замыкания нет, поэтому выражение на правой стороне будет оцениваться независимо от левой.   -  person Daniel Earwicker    schedule 18.10.2010
comment
@pmg: Почему это не ленивая оценка?   -  person codymanix    schedule 18.10.2010
comment
@codymanix: ленивая оценка заключается в отсрочке вычислений до момента, когда потребуются результаты. Это короткое замыкание, чтобы избежать неопределенного поведения (например, отложенного нулевого указателя).   -  person Oliver Charlesworth    schedule 18.10.2010
comment
Хммм... похоже, что некоторые люди называют это ленивой оценкой короткого замыкания ( c2.com/cgi/ wiki?LazyEvaluation ). Я не согласен: для меня ленивая оценка - это подготовиться оценить что-то, но не делать этого прямо сейчас; короткое замыкание — если все в порядке, сделайте что-то прямо сейчас, в противном случае никогда не делайте этого   -  person pmg    schedule 18.10.2010
comment
@oli: По вашему определению, короткое замыкание — это тоже ленивая оценка. Предотвращение доступа к неинициализированным значениям — это просто побочный эффект, который часто используется.   -  person codymanix    schedule 19.10.2010
comment
@codymanix: я думаю, это вопрос определения. Я согласен с определением pmg...   -  person Oliver Charlesworth    schedule 19.10.2010


Ответы (4)


Да, && закорочено, и вы используете его правильно.
Если next равно NULL, сравнение строк никогда не произойдет.

person codaddict    schedule 18.10.2010

Да, в коротком замыкании C++ доступны операторы and и or.

Вот ответ на вопрос в C-faq по этому вопросу.

person Pablo Santa Cruz    schedule 18.10.2010

Это определенно имеет место как в C, так и в C++.

person Jackson Pope    schedule 18.10.2010
comment
Исправление: это определенно верно для C, поэтому это должно быть верно и для C++. - person ruslik; 18.10.2010
comment
@ruslik - это не исправление. C++ и C охватываются стандартами, и этот ответ верен в отношении того, что говорят оба стандарта (для встроенных типов в C++) - person Daniel Earwicker; 18.10.2010

Это будет работать с ленивой оценкой (второй оператор не оценивается, если первый оценивается как «false»), если только ваш компилятор не настолько несовместим со стандартами, что его даже нельзя назвать компилятором C. Миллионы строк кода в полевых условиях основаны на этом поведении, так что вы можете думать, что такое поведение просто гарантировано.

person sharptooth    schedule 18.10.2010
comment
это называется оценкой короткого замыкания, ленивой оценкой является чем-то другим - person sp2danny; 16.10.2017