dev.net.ua

Українська Спільнота Розробникiв
 
Ласкаво просимо до dev.net.ua Увійти | Приєднатися | Допомога | Увійти Live ID
в Пошук

Konstantin Yushtin

С# это все-таки не C++

Почему-то я уверен, что мой пост будет первым в наступающем году.

Итак, начну с того, что многие думают, что порядок разбора выражений в C# идентичен С++. На самом деле, дело тут обстоит не совсем так. Мои слушатели обратили на данный факт мое внимание. Итак пусть есть два простых фрагмента кода на C#



static void Main(string[] args)

        {

            int f = 1;

            f +=f++;

            Console.WriteLine(f);           

        }

а это соответствующий фрагмент на С++ (тега почему-то нет в тулбаре)



void main()

{

    int f = 1;

    f += f++;

    cout<<f;

 }

Можете проверить, что результат будет разный, и интуитивно (как для меня) прогнозируемый результат получается именно в случае С++. Весь фокус в том, что строка разбирается слева направо в C# и справа налево в С++, то есть строка в C# трансфорируется в

 f = f + f++;

 в тоже время переставленный операнд

 f = f++ + f;

дает аналогичный результат как и в C++. Возможно, неточность в компиляторе или это тот самый случай когда от перемены мест слагаемых меняется сумма :)  или это связано с особенностями ValueType когда первая переменная копируется в отдельную область памяти и там инкрементируется отдельно от своего источника.

P.S. Согласен, что данный кусок кода может представлять собой плохо написанный фрагмент, но факт остается фактом - парсинг идет разный и это стоит учитывать. Хотя желающим я могу посоветовать писать правильно f += ++f, что работает одинаково на обоих языках.

P.P.S. Да, кстати, поздравляю всех с наступившим Новым 2008-м годом !

 

Опубліковані Tuesday, January 01, 2008 12:21 AM від Konstantin Yushtin

Коментарі

 

sochin сказав:

Согласно Стандарту С++ приведенный код(как и любой другой подобный код, изменяющий скалярный объект несколько раз или считывающий его значение после изменения в промежутке времени от одной sequence point к другой при вычислениях) приводит к неопределенному поведению ака undefined behavior. Так что тут дело не в том что нужно учитывать при кодировании, а просто нужно знать что так писать на С++ непозволительно в принципе.

January 3, 2008 12:23 AM
 

Konstantin Yushtin сказав:

Я полностью согласен, но хотел бы добавить, что так писать непозволительно еще и на C# :) В блоге я написал "что данный кусок кода может представлять собой плохо написанный фрагмент".

Но некоторые товарищи пишут, а потом удивляются, что результат C++ отличается от C#. Этот пример мне прислали в качестве вопроса, почему так происходит. Ну я и попытался разобраться при небольших затратах времени.

January 3, 2008 1:23 AM
 

Вячеслав сказав:

Недавно Konstantin Yushtin писал о особенностях разбора выражений компиляторами C# и C++, а сегодня я

January 14, 2008 5:49 AM
Анонімні коментарі деактивовані. Увійдіть або Зареєструйтесь щоб мати доступ до ресурсів Спільноти.