2015-10-05 2 views
-2

Я изучаю программирование C и в настоящее время около operators.I'm немного запутались в одной задаче sometimes.please имеет на изображении image1Как вывод c равен 53?

Программа:

#include<stdio.h> 
int main() 
{ 
    int a=9,b=5,c; 
    c=a*b++ + --a; 
    printf("%d",c); 
    return 0; 
} 


Я думаю, выход должен быть , но он показывает . Поскольку - у вас есть более высокий приоритет, поэтому он должен быть оценен первым и bis post increment, поэтому значение b будет изменено после окончания инструкции. (correct если я ошибаюсь).
Пожалуйста, помогите. Спасибо заранее.

+1

Старшинство не равно порядок вычисления в C. Например, компилятор может принять решение о первом приращении 'a', а затем оценить оба экземпляра' a'. – fuz

+0

Я не понял, что вы говорите, пожалуйста, уточните. –

+1

Ваши рассуждения о выводе оценочного порядка из приоритета неверны. Приоритет только сообщает компилятору, куда положить круглые скобки, он не сообщает компилятору, в каком порядке оценивать вещи. – fuz

ответ

1

Это классический случай неуказанного поведения. Здесь не указано, какая сторона оператора плюс должна быть оценена первой.

Если левая сторона + оценивается первым, то вы получите 53, как --a выполняется после a*b++.

Если правая сторона + оператора оценивается первым, то вы получите 48, как a-- выполняется первое сокращение a к 8 затем a*b++ запускается на выполнение приносит 40.

Итак, в зависимости от реализации компилятора, какая сторона оценивается первой, и, следовательно, она может давать разные ответы на разных компиляторах.

Вы можете прочитать больше о неопределенном поведении here

0

да странно! но вот возможный сценарий для вашего компилятора.

int a=9,b=5,c; 
/* 
c=a*b++ + --a; // 

*/ 

c = (a * b) ++; // умножение, затем сложение;

компилятор использует временный результат (a * b), а затем увеличит результат tmp (который теперь бесполезен), результат остается равным 45;

затем уменьшается перед добавлением его к конечному результату

с = 45 + (9-1) = 45 + 8 = 53

Смежные вопросы