Pull to refresh

Comments 23

Дело в том, что в Си для операции || требуется согласование типов. Вот так уже не напишешь.

(in = fopen("file", "r")) || return 1;


PHP я знаю плохо, но это требование, как я понимаю, намеренно ослаблено.
такая версия приходила мне в голову. вначале вместо printf'а я написал perror, а потом вспомнил, что это void. в общем похоже на правду, да.
Прежде чем отвечать, я проверил. Не напишешь!
return — это не функция, поэтому не напишешь.
Сплошь и рядом, мало вы кода видели. Просто типизация строгая и всё такое, и принципы другие.
в perl такие конструкции очень распространены, например
my $var = do_something() or die;
за счет того, что оператор or имеет более низкий приоритет, чем присваивание, выглядит очень естественно и локанично :)
Оператор || обычно используют иначе:
my $var = $a || $b;
его приоритет выше присваивания
Короткое вычисление логических выражений не входит в стандарт и может не поддерживаться компилятором. Поэтому так писать не рекомендуется.
Всё входит.
Только надо иметь в виду, что для перегруженных вычисляются оба, разумеется.
Что-то не помню.
В любом случае это не красивый код.
Зачем тогда вводить людей в заблуждение, если не помните?
Окей, прошу ссылку в студию на стандарт, в котором описано, что по умолчанию в С++ логические выражения вычисляются в сокращенной форме.
если бы оно не входило, то жить было бы вообще мрачно. при работе со списками часто хочется написать что-нибудь вроде
if (p && p->data != 3)
потому что использование if намного нагляднее

и вообще надо писать так:
FILE *f = fopen(«file», «r»);
if (f == NULL) {...}
и не экономить на строчках
А дело далеко не в наглядности, это не превалирующий фактор. Нормальный специалист такие конструкици разбирает легко и просто. Мне, например, конструкция
if (f == NULL)
режет глаза, намного привычнее и понятнее
if (!f)
и таких нюансов много. Кто начинал давно, того выкрутасами не удивишь. А на современных недопроггеров жалко смотреть. Всё им не так, всё им разжуй, только и слышно, что везде неправильно, везде убого, а сами даже двух строчек банальных разобрать не могут.
я ошибаюсь, или это называется неполной компиляцией выражений? Если так, то всё время считал, что она есть только в интерпретируемых языках. В том же PHP она используется очень часто, хотя и является временами причиной трудноотловимых багов.
помоему это особенно никак не называется, по крайней мере ни в стандарте, ни в википедии я названия не нашел. и это есть и в Си и в его наследниках.
Да когда времени или ума не хватало использовать smart\checked указатели(или когда их еще даже не изобрели) «smth or die» это все что спасало программу от креша)
extern void *p; //defined somewhere else
if (p && blah-blah...)
Русская рулетка? Пойду компилить под root'ом…
Если подобный оператор будет перегружен, то неполное вычисление не будет производиться. Вы будете долго искать ошибку :)
Sign up to leave a comment.

Articles