2015-12-11 8 views
1

Я новичок в c, и мне трудно понять сообщение и pre increment, я дал свой код ниже, я уже скомпилировал его в компиляторе turbo C++, и я получил вывод как a = 6 и b = 10но так как используется оператор пост прирост на выходе должен быть = 6 и Ь = 11, то почему это не происходит? может кто-то объяснить это ..Каково значение a ++ + a, если значение a равно 5?

#include<stdio.h>  
int main()  
{ 
    int a=5,b; 
    b = a++ + a;  
    printf("\na = %d and b = %d",a,b);  
    return 0;  
} 
+0

вы знаете, что код блоки, да? используй их. – nonchip

+0

Я голосую, чтобы закрыть этот вопрос вне темы из-за этого. –

+0

Скажите своему профи/TA, чтобы он оставил это домашнее задание на мусор. –

ответ

6

поведение a++ + a; является undefined C. Это связано с тем, что + не является пунктом последовательности, и вы по существу пытаетесь увеличивать и читать a в том же выражении.

Таким образом, вы не можете гарантировать конкретный ответ.

Для того, чтобы понять приращения префикса и суффикса, операторы используют как b = a++; и b = ++a;

+0

что такое последовательность? – prashanth

+0

когда я запустил ее в компиляторе linux ubuntu, я получил выход как a = 6 и b = 11 – prashanth

+0

@prashanth Вы должны Google, который: и сделает ваш учитель осведомлен о них, конструктивно, конечно. – Bathsheba

1

После int a = 5; значение a является 5

b = a; // b is 5; 

После int a = 5; значение a++ является 5

b = a++; // b is 5 

, но побочный эффект a++ должен увеличить значение a. Это увеличение может произойти в любое время между последней и следующей точками последовательности (в основном последняя и следующая точка с запятой).

Так

/* ... */; 
b = a++ + a; 
#if 0 
    /* side-effect */ 5 + 6 
    5 /* side-effect */ + 6 
    5 + /* side effect mixed with reading the value originating a strange value */ BOOM 
    5 + 5 /* side effect */ 
#endif 
3

Что происходит в следующем?

b = a++ + a; 

1) увеличивается a и его первоначальное значение добавляется к исходному значению a?

2) Увеличивается ли значение a, а его первоначальное значение добавляется к новому значению a?

3) Есть a с правой стороны, а затем добавлено к исходному значению приращения a?

C позволяет использовать любой из этих тезисов (и, вероятно, другие), поскольку в этой строке кода отсутствует точка последовательности , которая будет определять порядок оценки. Это отсутствие ограничений позволяет компиляторам часто делать оптимизированный код. Это происходит за счет того, что подходы не генерируют такой же результат при доступе к a различными способами выше.

Следовательно, это поведение, определяемое реализацией.Вместо этого:

b = a++; 
b = b + a; 

или

b = a; 
b = b + a++;