Friday, March 16th, 2012 03:26 pm

Из любимого юмористического сообщества ru_php я сегодня узнал, что в PHP логические операторы “and” и “or” имеют гораздо более низкий приоритет, чем “&&” и “||”.

Каково же было моё удивление, когда я обнаружил, что и в перле дело обстоит точно так же. То есть, 1 and 1 || 0 and 0 — это вовсе не то же самое, что 1 and 1 or  0 and 0.

Я, правда, or применял исключительно в конструкциях “foo() or die()”, поэтому на эти грабли ни разу не наступил. Но это ж надо было ТАКОЕ придумать..

Оригинал этой записи в личном блоге.
Любые материалы из этого блога запрещается использовать на сайте livejournal.ru в любой форме и любом объёме.

Friday, March 16th, 2012 03:42 pm (UTC)
скобочки надо ставить. Всегда. Тогда проблем не возникнет.
Friday, March 16th, 2012 03:55 pm (UTC)
И писать на лиспе. А то чо ваще.
Friday, March 16th, 2012 03:58 pm (UTC)
Ну да, так и задумано, если знать.
$foo = fetch_foo() // 42;
$foo = fetch_foo() and bar($foo);

Оба раза происходит то, что можно подумать.
Friday, March 16th, 2012 04:16 pm (UTC)
2) && имеет приоритет выше =
1) // — пожалуй. Но с || оно тоже вполне бывает.
Friday, March 16th, 2012 04:25 pm (UTC)
ну, перл - это вообще очень специальный язык. Я все-таки про PHP. ;)
Friday, March 16th, 2012 09:13 pm (UTC)
Насколько я помню, двойная запись одного и того же логического оператора - это именно из-за желания игр с приоритетом. Не любили авторы скобочки, вот, для упрощения записи, и сделали :)

Saturday, March 17th, 2012 03:04 am (UTC)
> А для // нет аналога в виде слова.
есть -- err
Saturday, March 17th, 2012 03:05 am (UTC)
собственно, для того эти операторы и сделаны парами, чтобы у них разный приоритет был
Saturday, March 17th, 2012 03:43 pm (UTC)
его удалили: http://www.nntp.perl.org/group/perl.perl6.language/2008/09/msg29589.html

но он был достаточно долго, чтобы его было легко найти (http://www.google.com/search?&q=perl+"err"+operator). например вот: http://search.cpan.org/~rgarcia/perl-5.9.3/lib/feature.pm#the_'err'_feature