TIL

Mar 18, 2017 19:40

Ternary operator f() ? g() : h() is left associative in PHP (unlike any other C-like language).
Another fun fact about ?: its result can be an lvalue in C++: http://stackoverflow.com/questions/8535226/return-type-of-ternary-conditional-operator.

c++, php

Leave a comment

Comments 6

yatur March 19 2017, 16:04:58 UTC
Я тут почитал про все эти xvalue, glvalue и прочие lpszvalue в новом С++. Я даже не знаю, что сказать. Вроде все логично, но очень уж сильно начинает напоминвть PL/1. По слухам, это был один из самых развесистых языков, который почти никто не знал до конца.

Reply

aklepatc March 19 2017, 17:04:03 UTC
Да. Когда приходится возвращаться к С++ после более "человеческих" языков, часто возникает вопрос: ну зачем все эти сложности? Вопрос чисто риторический, конечно.

Reply

aklepatc March 19 2017, 17:27:42 UTC
?: в качестве lvalue - скорее забавный семантический момент, чем странности С++. Когда написано (a ? b : c) = d; это выглядит несколько странно, но понятно, что происходит. Настолько понятно, что возникает вопрос: а почему в других языках так нельзя? Странности С++ начинаются, когда b и c разных типов (хоть и совместимых по присваиванию). Тут вся конструкция перестаёт компилироваться и у бедного программиста наступает лёгкий WTF...

Reply

yatur March 20 2017, 20:27:00 UTC
> почему в других языках так нельзя?

Потому что в других языках нет понятия указателя или, чур меня, ссылки. Там присваивать можно только переменным или их свойствам/полям.

В тех языках, где есть указатели (С, Паскаль), вполне можно написать что-то подобное:

*(f()?g():h()) = 42;
^(SomeFunctionCall(1,2,3)) := 42; /* too bad Pascal does not have a ternary operator */

PS. В других языках зато можно вот так:
/* JavaScript */
var x = {};
var y = {};
var z = 42;

(z > 40?x:y).field = 99;

Reply


Leave a comment

Up