Пожалуйста, объясните мне этот код оператора приращения и декремента [закрыто]

Ниже приведен код, который я запускаю в ubuntu 13.10. Код: -

    #include<stdio.h>
    main()
    {
       int i=10,j=10;
       i=i++ + ++j;
       printf("i=%d j=%d\n",i,j);
       j=++i + j++;
       printf("i=%d j=%d\n",i,j);
    }

Вывод: -

    i=21 j=11 
    i=22 j=33

Логически, согласно правилам ans должно быть: -

    i=22 j=11
    i=23 j=35

И когда я запускаю этот код в ubuntu 12.10, я получаю правильный ответ, т.е. выше ans. Пожалуйста, объясните, что происходит ??

1
задан 22 March 2014 в 09:43

1 ответ

Это - типичный результат неопределенного или зависящего от реализации поведения. Когда Ваше выражение изменяет переменную на обоих сайтах уравнения (среди многих других ситуаций), Вы в основном делаете его неправильно. Просто, потому что это "работает" с одним релизом компилятора, не означает, что это даст тот же ответ в следующем выпуске. Прочитайте спецификацию языка тщательно для наблюдения, какие вещи являются неопределенными или зависящими от реализации, и избегают их. Никакой ответ не "корректен", они не определены. Различные ответы могут даже быть инициированы различной оптимизацией того же компилятора.

<час>

На практике, необходимо использовать флаги предупреждения компилятора и инструмент статического анализа как valgrind или Очистить для установки флага этих видов вещей. И пока Вы не понимаете значение условий как "Lvalue", и "Rvalue", просто с помощью таблицы приоритета оператора не действительно достаточен для понимания то, что продолжает часть из пред/сообщение фиксация incre/decre операторы.

0
ответ дан 8 October 2019 в 10:55

Другие вопросы по тегам:

Похожие вопросы: