Pull to refresh

Comments 35

UFO just landed and posted this here
тоже не знаю но считаю что таких конструкций следует избегать в любом языке т.к. это не очень хорошо читается и поведение скорее всего зависит от компилятора.
Интересная статья, спасибо за ссылку.
Я один не понял, что вы нашли необычного в примере 4? Вполне естественное поведение исключений, причём не только в C#
Согласен, ничего необычного нет. Просто, когда я в первый раз на это наткнулся, был немного удивлен. Вроде бы и там и там эксепшн выходит за метод, и finally должен сработать.
который раз убеждаюсь, что (в случаях с первым примером) даже если синтаксис языка позволяет укоротить запись кода, не надо этого делать ради своего же блага
>> x ^= y ^= x ^= y;

У меня ощущение, что теперь я знаю кто пишет код наподобие: i = ++i + ++i;
раньше участвовал в олимпиадах acm, там меня этому приему и научили. Только вот в C++ работает такой синтаксис, а в C# почему-то нет.
Он и в C/C++ не работает.

Почему не работает — это про sequence points читать надо.
Только что специально проверил в Visual Studio 2008. Сработало.
Исходное выражение (x ^= y ^= x ^= y; да и i = ++i + ++i; ) приводит к undefined behavior.

Результатом может являться всё, что угодно. Жёсткий диск, например, отформатировать. Или занести мусор в значения x и y.

Иногда результатом undefined behavior является тот результат, которого ожидает программист — «правильные» значения в переменных.
Хорошо объяснил :)
Напомнило, как делают корабли в бутылках:
UFO just landed and posted this here
Мне нравилось — отличная зарядка для мозгов.
для тех, кто будет читать код? )
В таких олимпиадах код не читают.
UFO just landed and posted this here
Пример с xor'ами, как я написал выше часто используется в олимпиадах, потому что не требует доп. памяти. В случае же с sql-примерами, они мне встречались на работе и приводили к ошибкам.
Вот зачем чтобы обменять местами переменные, городить XOR?
Так прекрастно работает:

int a = 5;
int b = 13;
Console.WriteLine( "a={0} , b={1}", a, b );
a = a + b;
b = a - b;
a = a - b;
Console.WriteLine( "a={0} , b={1}", a, b );


* This source code was highlighted with Source Code Highlighter.
UFO just landed and posted this here
Какое такое переполнение?
int a = int.MaxValue;
int b = int.MaxValue - 10;

Console.WriteLine("a = {0};b = {1}", a, b);
      
a = a + b;
b = a - b;
a = a - b;
      
Console.WriteLine("b = {0};a = {1}", b, a);


* This source code was highlighted with Source Code Highlighter.


Результат:

a = 2147483647;b = 2147483637
b = 2147483647;a = 2147483637
Компилятор C# рулит ;)
UFO just landed and posted this here
UFO just landed and posted this here
На то они и разные языки программирования, чтобы иметь свои нюансы
UFO just landed and posted this here
а если в переменных, к примеру, строки?
Можно посимвольно) но, наверное, со строками лучше использовать 3-ю переменную.
Вы серьёзно считаете, что экономия 4 байт в стеке поможет уложиться в ограничения по памяти? При условии что любой нормальный компилятор (а gcc и visual studio и подавно) соптимизируют эту временную переменную так, что она будет лежать в регистре и ровно столько, сколько нужно.
На одном собеседовании предлагали задачку:
Без использования доп. памяти перевернуть строку, т.е. из «мама мыла раму» сделать «раму мыла мама»
Решается как раз таким способом.
И что? Ещё одна сферическая задача в вакууме?

Ещё раз прочитайте то, что я вам написал: даже если вы объявите «лишнюю» автоматическую переменную, любой нормальный оптимизирующий компилятор разместит её в регистре на всё время жизни. И, вполне возможно, результирующий код с xor будет хуже, так как компилятору будет гораздо сложнее понять ваши намерения.
Пример 3 задокументирован в стандарте SQL. Любая уважающая себя СУБД, корректно работающая с троичной логикой, работает именно так.
Объясните, пожалуйста, а то я эту логику что-то не понимаю.
Всегда думал, что «x in (a, b, c)» — это то же самое, что и «x = a or x = b or x = c», а «x not in (a, b, c)» == «x != a and x != b and x != c».
Или Null — это не неопределённое значение, а что-то типа пустого множества?
Так и есть, только сравнивать с NULL в sql нужно не оператором "=", а IS NULL/IS NOT NULL.
Сделайте SELECT 1 != NULL и посмотрите на результат.
Sign up to leave a comment.

Articles