- 1
if (!done && (done = true)) setlocale(LC_CTYPE, "");
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+1013
if (!done && (done = true)) setlocale(LC_CTYPE, "");
из свежих ворнингов компилера.
похоже у какого-то тима стратегические запасы фигурных скобок иссякли.
как по мне - неопределенность, потому что значение переменной в том же самом условии и проверяется и меняется.
но по старым традициям С, условия проверяются/исполняются строго слева на право и останавливаются когда результат условия становится известен.
поэтому оба условия работают: до присвоения исполнение не дойдет пока первая часть "&&" условия false.
А можно пример языка, в котором порядок вычисления операндов "&&" неопределен?
с другой стороны. многие языки просто по семантике такое не позволяют. в С это работает за счет "side effects": у присвоения тоже есть результат. некоторые языки (например функциональные) стремятся искоренять эти побочные эффекты и просто исключают возможность смешивания присвоений и проверок. поэтому как бы проблемы в принципе и не существует.
еще из классики жанра: MS Visual Basic. там как такого була нету и выражения всегда вычисляются полностью и результат проверяется на true-ness. хотя даже в VB я слышал спец операторы были введены что бы только часть выражения вычислялась, а не все целиком.
Не слышал об таком.
Все т.н. "спец-операторы" в версиях до .NET сводились к:
замене
if (cond1 and cond2) then
на
if (cond1) then
if (cond2) then
А всё оттого, что у MS VB был мудацкий компилятор.
AndAlso -> &&
OrElse -> || ?
>OrElse -> ||
Да. В VB.NET добавили много сишных и жавовских фич (try - catch for example) дабы сделать его максимально близким к шарпам.
>VB.NET Operators
>в версиях до .NET сводились к:
>до .NET
VB <> VB.NET
Мало кого ебёт что там в Erlang
Порядок вычисления встроенных операторов '&&' и '||' (и свойство из "сокращенного вычисления") жестко закреплены стандартами этих языков, а не является какой-то произвольной данью "старым традициям".
"точка следования" это официальный перевод на русский?
Только вот в C++11 их отменили.
С++ в этих вещах ссылается на С, так как стандарты (с С++11 полностью) гармонизированы.
С стандарты - что С99 что С11 определяют sequence point'ы.
во-первых. 1.1, #2 - генеральное заявление, что С++ не противоречит С где это не оговорено. норматив ISO для надстроек над существующими стандартами. переиспользуемые стандарты перечислеными в 1.2 - включая С99.
во-вторых. n2239, "A finer-grained alternative to sequence points" - они просто переименовали "sequence points" в "sequenced before". и blimey последние апдейты к С11 тоже переименовали это дело в С стандарте.
не отменили - просто переименовали.
и расширили - т.к. многопотчность впервые попала официально в стандарт.
ну да называй как тебе это нравится. мне имена по барабану, если я знаю о чем ты говоришь ;)
И был бы прав.
Например, наличие точек следования автоматически подразумевает возможность partitioning-а, т.е. разделение всего множества событий на две четкие группы: одна группа происходит до точки следования другая - после (аналогично partitioning-у в алгоритме quicksort).
Идея же порядка, основанного на "sequenced before" (без каких либо дополнительных ограничений), задает лишь частичный порядок, который в общем случае не допускает однозначного partitioning-а.
Проблема точек следования как раз таки и заключалась во многом в том, что они превносили в язык чрезмерно жесткое требование partitioning-а. Во времена исключитально последовательного программирования это не мешало, но в современно программировании мы уже начали упираться в чрезмерную жесткость этого требования. Поэтому его и ослабили.
Это принципиальное изменение, а не какое-то "переименование".
Во-вторых, именно эту идею, на самом деле, пытались реализовать изначально при помощи "точек следования", но тогда выбрали чрезмерно жесткий механизм, т.е. точки следования.
В-третих, формальное обоснование потребудет анализа пол-стандарта. Поля этого форума, так сказать, слишком узки... К тому же, я думаю, это уже было сделано. Читайте труды комитета.
теперь я думаю ты тоже готов назвать это "переименовали" и пойти заниматься чем-нибудь полезным.
Не заметил. Код старого стандарта не компилируется в новом:
1)Старое auto перестало работать, хоть это и не страшно.
2)Перекрывающие виртуальные методы во всех используемых библиотеках (в том числе и чужих) и во всем коде программы приходится помечать override или final иначе ошибка компиляции. А вот это уже очень напряжно.
Какие несовместимости ещё забыл?
Снова "итт-илитный" (ц) юмор?!
А я тут для тебя картинку сделал. Вернее про тебя.
http://rghost.ru/36535887