2013-06-16 4 views
-3

Почему с указанием значения р, как увеличивается в два раза, даже если в соответствии с кодом он должен быть увеличен позжеC++ код, показывающий странное поведение

#include "iostream.h" 
#include "conio.h" 

using namespace std; 

int main() 
{ 
    int i; 
    cin>>i; 
    int *p;   // p is a pointer to int 
    int *&r = p; // r is a reference to the pointer p 

    r = &i;  // r refers to a pointer; assigning &i to r makes p point to i 
    cout<<*p<<*r<<(*p)++<<*p<<*r<<(*r)++<<endl; 

    getch(); 
    return 0; 
} 
+9

Почему люди настаивают на том, чтобы делать глупые вещи, а затем задавались вопросом, почему они не работают так, как они ожидают? :-) – paxdiablo

+0

dats rude ... но зайдите и запустите код, который вы обнаружите, что он показывает странное поведение ... Мне любопытно узнать .. ПОЧЕМУ –

+0

Этот код не относится к указателям или ссылкам вообще. Откат к второй ревизии. – soon

ответ

1

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

#include <iostream> 

using namespace std; 

int main() 
{ 
    int i = 1; 
    cout << i << i << i++ << i << i << i++ << endl; 
    return 0; 
} 

В данном конкретном случае от конкретного компилятора я использую ... (т.е. все это не определено или не определено поведение - я просто пытаюсь интерпретировать результаты Вы всегда должны избегать написания кода, который вызывает неопределенными. behavour).

Сначала оцениваются аргументы 3 и 6 (потому что у них есть операторы ++, прикрепленные? Спасибо rodrigo).

Таким образом, самый правый i++ подходит к 1 и имеет i as 2.

Далее оценивается 3-й аргумент i++, что дает 2 и оставляет i как 3.

Все остальные аргументы оцениваются в 3. Вот как вы получаете выход

332331.

Обратите внимание, что порядок оценки перенаправленных элементов не указан, то есть он может меняться от компилятора к компилятору и т. Д., Вы не можете знать, каким он будет.

Смотрите также Order of evaluation of arguments using std::cout

Как @rodrigo указывает мне, так как i увеличивается в два раза в том же выражении результаты являются неопределенными.

Так что в игре много гремлинов, это, возможно, правильная, возможно, некорректная интерпретация того, как генерируется выход.

+0

Наконец-то! Ваши последние два абзаца полностью объясняют проблему. +1, это ответ. – soon

+2

'i' изменяется дважды, поэтому на самом деле результат _undefined behavior_. И в скобках здесь нет абсолютно ничего. – rodrigo

+0

atlast какое-то релевантное объяснение..thanx @wayne uroda –

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