Объясните работу этой C-программы - PullRequest
1 голос
/ 14 марта 2011

Пожалуйста, объясните работу в каждом случае.

Почему оба случая имеют одинаковый выход?

Случай I:

int main (void)
{
    int i = 5;
    if(i == ++i)           //plz explain here How values are checked
       printf("Equal");
    else
      printf("Not Equal");

  return 0;
}
//Output: Equal;

Случай II:

int main (void)
{
    int i = 5;
    if(++i == i)            //plz explain here How values are checked
       printf("Equal");
    else
      printf("Not Equal");

  return 0;
}
//Output: Equal;

Ответы [ 2 ]

10 голосов
/ 14 марта 2011

Ни одна из этих программ не является действительной; Вам не разрешено читать и обновлять одну и ту же переменную без промежуточной точки. Таким образом, поведение этих программ не определено, поэтому тот факт, что они могут вернуть один и тот же ответ вашему компилятору и компьютеру, ничего не значит.

0 голосов
/ 14 марта 2011

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

Теперь, почему это работает?

Гипотеза № 1:

i может храниться в регистре, скажем, r1, и компилятор может компилировать все это сравнение в одну инструкцию CMP с режимом автоинкрементной адресации. Скажем, это CMP ++r1, r1 или CMP r1, ++r1, тогда, в зависимости от фактического процессора, оба могут возвращать истинное сравнение.

Гипотеза № 2:

Компилятор может компилировать сравнение в:

inc r1   // increment r1
CMP r1, r1   // compare with itself

Гипотеза № 3:

Компилятор может оптимизировать, чтобы всегда размещать простой доступ к переменной с правой стороны. Это разрешено делать, потому что порядок выполнения в операторе == не определен, и компилятор может перестраивать вещи по своему усмотрению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...