Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Приоритет операций, Использование приоритета при вычислении 
V
    Опции темы
Grandpa
Дата 21.3.2007, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 24.7.2003
Где: Одесса

Репутация: нет
Всего: нет



Код на C# (выполнялся на Microsoft Visual C# 2005 Express)

Код

            int x = 1, z = ++x + x;
            Console.WriteLine (x.ToString () + "  " + z.ToString ());
            x = 1;
            int z1 = x + ++x;
            Console.WriteLine (x.ToString ()  + "  " + z1.ToString ());

код на C++ (выполнялся на CBuilder 6)

Код

            int x = 1, z;
            z = ++x + x;
            cout << x  << "  " << z;
            x = 1;
            int z1 = x + ++x;
            cout << endl << x <<  "  " << z1;



приоритет операции ++ выше приоритета операции +, и в С++ и в C#, а результаты для z1 = x + ++x; разные!
В первом случае (C#):
2 4
2 3
во втором (C++)
2 4
2 4
Какая то новая фишка?  smile  

PM ICQ   Вверх
agl
Дата 21.3.2007, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 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
PM   Вверх
MFSham
Дата 21.3.2007, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 28.8.2005
Где: Беларусь, Гродно

Репутация: нет
Всего: 3



В приведенной ссылке имеется такой абзац:
Цитата

//операции increment и decrement
//Следующее выражение допустимо, но писать подобное никогда не следует
in1 = ++in1 +in1+ in1++;
//in2 = ++in1 + in1++ + in1;
Console.WriteLine(" in1= " + in1);

Обратите внимание, что хотя у постфиксной операции высший приоритет, это вовсе не означает, что при вычислении выражения вначале выполнится операция in1++, затем ++in1, и только потом будет проводиться сложение. Нет, вычисления проводятся в том порядке, в котором они написаны. 

Видимо в С++ приоритеты операций выполнняются все-таки в соответствии с таблицей приоритетов операций smile
--------------------
Без ветра трава неподвижна. Без программ компьютеры бесполезны.
PM MAIL   Вверх
Grandpa
Дата 22.3.2007, 08:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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. 


PM ICQ   Вверх
_Dream
Дата 22.3.2007, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 4.11.2006
Где: Там

Репутация: нет
Всего: нет



чет не ясно
то что ++х и х++ это разные вещи и так понятно
а почему компиляторы по разному интерпретируют? это же и был основной вопрос. так вроде он и остается открытым или я чтото не понял?
Цитата

 it's just that the code is being interpreted by different compilers and therefore will behave differently. 

эта строка не очень то это обьясняет smile
--------------------
Noone dies a virgin. Life screws us all...
PM MAIL ICQ GTalk   Вверх
Idsa
Дата 22.3.2007, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 14
Всего: 62



Цитата(Grandpa @  22.3.2007,  08:47 Найти цитируемый пост)
Считаю, что в этом отношении C# не наследует положительных черт C++ и опасность использования выражений такого типа в нем гораздо выше.

А мне кажется поведение C# в этой ситуации логичней.


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
MFSham
Дата 22.3.2007, 19:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 28.8.2005
Где: Беларусь, Гродно

Репутация: нет
Всего: 3



Цитата(_Dream @  22.3.2007,  14:27 Найти цитируемый пост)
а почему компиляторы по разному интерпретируют?

Может в вопросе уже содержится ответ? --> Потому, что компиляторы по разному интерпретируют. smile Один в строгом соотрветствии с таблицей приоритетов(С++), а второй - линейно(С#) + таблица. 

Цитата(Idsa @  22.3.2007,  14:32 Найти цитируемый пост)
А мне кажется поведение C# в этой ситуации логичней.

Я тоже согласен с этим высказыванием, но частично. В документации указывается приоритет операций, а потом замечается, что вычисления выполняются по порядку(С#). Тогда встает разумный вопрос: а зачем тогда как таковая таблица приоритета? Для решения спорных ситуаций?

 Да, если воспринимать выражение визуально, то, конечно, логичнее его выполнять по порядку для равноправных операций(как собственно в школе учили). Но в школе также учили, что операция умножения сильнее операции сложения, и именно ее надо выполнить в первую очередь. 
Хочется заметить, что если рационально и по назначению использовать операции, то никаких "необъяснимых" результатов не возникнет. smile
--------------------
Без ветра трава неподвижна. Без программ компьютеры бесполезны.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.1032 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.