2013-08-27 7 views
0

Я видел интересное заявление сегодня с пост-приращением и предварительным приращением. Пожалуйста, рассмотрите следующую программу:Что произойдет, если я использую pre increment и post increment в том же самом выражении?

#include <stdio.h> 

int main(){ 
    int x, z; 

    x = 5; 
    z = x++ - 5; // increase the value of x after the statement completed. 
    printf("%d\n", z); // So the value here is 0. Simple. 

    x = 5; 
    z = 5 - ++x; // increase the value of x before the statement completed. 
    printf("%d\n", z); // So the value is -1. 

    // But, for these lines below.. 

    x = 5; 
    z = x++ - ++x; // **The interesting statement 
    printf("%d\n", z); // It prints 0 

    return 0; 
} 

Что происходит на самом деле в этом интересном заявлении? Пост-инкремент должен увеличить значение x после завершения инструкции. Тогда значение первое x остается 5 для этого утверждения. И в случае предварительного приращения значение second x должно быть 6 или 7 (не обязательно).

Почему это дает значение от 0 до z? Было ли это 5 - 5 или 6 - 6? Пожалуйста, объясни.

+0

Вы идете в неопределенное поведение, это действительно зависит от того, как его обрабатывает компилятор. –

+0

Также [этот] (http://stackoverflow.com/questions/4176328/undefined-behavior-and-sequence-points). – jrok

ответ

10

Это Неопределенное поведение. Компилятор может делать все, что захочет - он может дать 0, он может дать 42, он может стереть ваш жесткий диск, или это может заставить демонов вылететь из вашего носа. Все эти поведения разрешены стандартами языка C и C++.

+7

Фактически раздел '14.2.7' явно запрещает компилятору генерировать код, создающий носовые демоны, однако допускаются все другие действия. – Paulpro

+0

Что такое undefined - это утверждение? Java не колеблясь минуту;) – Julien

+0

Хорошо, так что это неопределенное поведение. Но почему? Я бы подумал, что это оценивается как 5-6 (++ x идет перед вычитанием, x ++ после него). Изменил бы его на (x ++) - (++ x) изменить результат? – Kevin

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

  • Нет связанных вопросов^_^