![]() |
Модераторы: Partizan, gambit |
![]() ![]() ![]() |
|
Grandpa |
|
||||
Новичок Профиль Группа: Участник Сообщений: 38 Регистрация: 24.7.2003 Где: Одесса Репутация: нет Всего: нет |
Код на C# (выполнялся на Microsoft Visual C# 2005 Express)
код на C++ (выполнялся на CBuilder 6)
приоритет операции ++ выше приоритета операции +, и в С++ и в C#, а результаты для z1 = x + ++x; разные! В первом случае (C#): 2 4 2 3 во втором (C++) 2 4 2 4 Какая то новая фишка? ![]() |
||||
|
|||||
agl |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 65 Регистрация: 25.6.2006 Репутация: нет Всего: 3 |
Странно
http://www.intuit.ru/department/pl/csharp/class/free/6/ А вообще, видимо подход другой, линейный: z1 = x + ++x 1)отправляем в z1 x 2) инкремент x 3)добавляем к z1 x |
|||
|
||||
MFSham |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 220 Регистрация: 28.8.2005 Где: Беларусь, Гродно Репутация: нет Всего: 3 |
В приведенной ссылке имеется такой абзац:
Видимо в С++ приоритеты операций выполнняются все-таки в соответствии с таблицей приоритетов операций ![]() --------------------
Без ветра трава неподвижна. Без программ компьютеры бесполезны. |
|||
|
||||
Grandpa |
|
|||
Новичок Профиль Группа: Участник Сообщений: 38 Регистрация: 24.7.2003 Где: Одесса Репутация: нет Всего: нет |
Поскольку вышеуказанные ответы меня удовлетворили не полностью, я обратился на другие форумы. Наиболее полный ответ я получил на форуме The Code Project привожу его ниже. Считаю, что в этом отношении C# не наследует положительных черт C++ и опасность использования выражений такого типа в нем гораздо выше.
Благодарю всех кто откликнулся, Ваше мнение для меня действительно ценно. For ++x + x, because of the location of the pre-increment x is pre-incremented before it's value is substituted in the in the equation - so the expression effectively evaluates to z = 2 + 2. For x + ++x the value of x is substituted as the first operand in the equation before it is modified, then it is pre-incremented and substituted as the second operand in the expression. This makes the expression evaluate to z1 = 1 + 2. At least that appears to be what's going on . . . -- modified at 10:39 Wednesday 21st March, 2007 The compiler/run time environment/whatever has to substitute the value of x into both expressions twice. The first expression is evaluated as such: z = ++x + x; // x equals 1 z = (x = x+1) + x; // x still equals 1 z = 2 + x; // x now equals 2 z = 2 + 2; z = 4; Whereas the second expression is evaluated like this: z1 = x + ++x; // x equals 1 z1 = 1 + ++x; // x still equals 1 z1 = 1 + (x = x+1); // x still equals 1 z1 = 1 + 2; // now x equals 2 z1 = 3; In both expressions the pre-increment is performed before the addition, keeping the order of operation correct, but in the first expression the pre-increment happens before the value of x is substituted for the 2nd operand in the addition. In C++ the compiler will examine the entire expression and evaluate any pre-increments before it does any value substitutions (apparently - this probably depends on what optimizations/type modifiers you specify), so it isn't that C++ doesn't have this problem, it's just that the code is being interpreted by different compilers and therefore will behave differently. |
|||
|
||||
_Dream |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 133 Регистрация: 4.11.2006 Где: Там Репутация: нет Всего: нет |
чет не ясно
то что ++х и х++ это разные вещи и так понятно а почему компиляторы по разному интерпретируют? это же и был основной вопрос. так вроде он и остается открытым или я чтото не понял?
эта строка не очень то это обьясняет ![]() --------------------
Noone dies a virgin. Life screws us all... |
|||
|
||||
Idsa |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2086 Регистрация: 5.12.2006 Где: Томск Репутация: 14 Всего: 62 |
||||
|
||||
MFSham |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 220 Регистрация: 28.8.2005 Где: Беларусь, Гродно Репутация: нет Всего: 3 |
Может в вопросе уже содержится ответ? --> Потому, что компиляторы по разному интерпретируют. ![]() Я тоже согласен с этим высказыванием, но частично. В документации указывается приоритет операций, а потом замечается, что вычисления выполняются по порядку(С#). Тогда встает разумный вопрос: а зачем тогда как таковая таблица приоритета? Для решения спорных ситуаций? Да, если воспринимать выражение визуально, то, конечно, логичнее его выполнять по порядку для равноправных операций(как собственно в школе учили). Но в школе также учили, что операция умножения сильнее операции сложения, и именно ее надо выполнить в первую очередь. Хочется заметить, что если рационально и по назначению использовать операции, то никаких "необъяснимых" результатов не возникнет. ![]() --------------------
Без ветра трава неподвижна. Без программ компьютеры бесполезны. |
|||
|
||||
![]() ![]() ![]() |
Прежде чем создать тему, посмотрите сюда: | |
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |