Comments 35
UFO just landed and posted this here
тоже не знаю но считаю что таких конструкций следует избегать в любом языке т.к. это не очень хорошо читается и поведение скорее всего зависит от компилятора.
+5
Разоблачение здесь: habrahabr.ru/blogs/net/58333/
0
Я один не понял, что вы нашли необычного в примере 4? Вполне естественное поведение исключений, причём не только в C#
+9
который раз убеждаюсь, что (в случаях с первым примером) даже если синтаксис языка позволяет укоротить запись кода, не надо этого делать ради своего же блага
+1
>> x ^= y ^= x ^= y;
У меня ощущение, что теперь я знаю кто пишет код наподобие: i = ++i + ++i;
У меня ощущение, что теперь я знаю кто пишет код наподобие: i = ++i + ++i;
+9
раньше участвовал в олимпиадах acm, там меня этому приему и научили. Только вот в C++ работает такой синтаксис, а в C# почему-то нет.
-3
Он и в C/C++ не работает.
Почему не работает — это про sequence points читать надо.
Почему не работает — это про sequence points читать надо.
+3
Только что специально проверил в Visual Studio 2008. Сработало.
-1
Исходное выражение (x ^= y ^= x ^= y; да и i = ++i + ++i; ) приводит к undefined behavior.
Результатом может являться всё, что угодно. Жёсткий диск, например, отформатировать. Или занести мусор в значения x и y.
Иногда результатом undefined behavior является тот результат, которого ожидает программист — «правильные» значения в переменных.
Результатом может являться всё, что угодно. Жёсткий диск, например, отформатировать. Или занести мусор в значения x и y.
Иногда результатом undefined behavior является тот результат, которого ожидает программист — «правильные» значения в переменных.
+5
UFO just landed and posted this here
UFO just landed and posted this here
Пример с xor'ами, как я написал выше часто используется в олимпиадах, потому что не требует доп. памяти. В случае же с sql-примерами, они мне встречались на работе и приводили к ошибкам.
-1
Вот зачем чтобы обменять местами переменные, городить 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.
+1
UFO just landed and posted this here
Какое такое переполнение?
Результат:
a = 2147483647;b = 2147483637
b = 2147483647;a = 2147483637
Компилятор C# рулит ;)
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# рулит ;)
0
UFO just landed and posted this here
А в 2010 студии уже рулит ;)
msdn.microsoft.com/en-us/library/h25wtyxf.aspx
The default value for this option is /checked-.
If /checked- is used in the compilation, that statement does not cause an exception at run time
msdn.microsoft.com/en-us/library/h25wtyxf.aspx
The default value for this option is /checked-.
If /checked- is used in the compilation, that statement does not cause an exception at run time
-1
UFO just landed and posted this here
а если в переменных, к примеру, строки?
+1
Вы серьёзно считаете, что экономия 4 байт в стеке поможет уложиться в ограничения по памяти? При условии что любой нормальный компилятор (а gcc и visual studio и подавно) соптимизируют эту временную переменную так, что она будет лежать в регистре и ровно столько, сколько нужно.
+1
На одном собеседовании предлагали задачку:
Без использования доп. памяти перевернуть строку, т.е. из «мама мыла раму» сделать «раму мыла мама»
Решается как раз таким способом.
Без использования доп. памяти перевернуть строку, т.е. из «мама мыла раму» сделать «раму мыла мама»
Решается как раз таким способом.
-1
И что? Ещё одна сферическая задача в вакууме?
Ещё раз прочитайте то, что я вам написал: даже если вы объявите «лишнюю» автоматическую переменную, любой нормальный оптимизирующий компилятор разместит её в регистре на всё время жизни. И, вполне возможно, результирующий код с xor будет хуже, так как компилятору будет гораздо сложнее понять ваши намерения.
Ещё раз прочитайте то, что я вам написал: даже если вы объявите «лишнюю» автоматическую переменную, любой нормальный оптимизирующий компилятор разместит её в регистре на всё время жизни. И, вполне возможно, результирующий код с xor будет хуже, так как компилятору будет гораздо сложнее понять ваши намерения.
+1
Пример 3 задокументирован в стандарте SQL. Любая уважающая себя СУБД, корректно работающая с троичной логикой, работает именно так.
0
Объясните, пожалуйста, а то я эту логику что-то не понимаю.
Всегда думал, что «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 — это не неопределённое значение, а что-то типа пустого множества?
Всегда думал, что «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 — это не неопределённое значение, а что-то типа пустого множества?
0
Sign up to leave a comment.
Знаете ли вы как работает этот код?