2013-06-11 4 views
2

когда я использую #define функция, я наблюдаю что-то странное. В приведенном ниже коде, если я дал i значение как '10' с ввода i получил выход как 132. Однако, если я объявляю i=10, комментируя 10,12 и 13 строк, тогда мой вывод 144. может ли кто-нибудь объяснить мне, как это происходит? заранее спасибоошибка с определением определения макроса

#include <iostream> 
using namespace std; 

#define Double(X) X*X 

int main() 
{ 

//int i=10; 
int i; 

cout<<"Enter the i values:" <<endl; 
cin>>i; 

cout<<"Values is:"<<Double(++i)<<endl; 

return 0; 
} 

ответ

1

Что у вас есть неопределенное поведение.

Вы Double(++i) изменен на ++i * ++i, когда вы скомпилируете код.

6

Double(++i) будет расширяться до ++i * ++i. В этом выражении i дважды модифицируется без промежуточного sequence point, который является неопределенным поведением.

Read: So, what's wrong with using macros?

+0

да я понимаю, что это ++ я * ++ я, но почему результат изменяется для обоих cases.I означает, что если я объявляю «i = 10», тогда мой результат равен 132. Также, если я предоставляю значение «i» с использованием cin, результат равен 144. – user2413497

+0

@ user2413497 это то, что мы говорим [неопределенное поведение] (http: // en .wikipedia.org/вики/Undefined_behavior)! –

+0

@ phant0m Я помню тебя :) спасибо! –

-1

макросов есть тонкости. Что макрос делает: Double(++i) -> ++i*++i

в вашем случае 11 * 12 или 12 * 11

+0

нет, см. Другие ответы. –

+1

Или даже '13 * fish' –

+0

Да, я понимаю, что это ++ i * ++ i, но почему результат варьируется для обоих случаев. Я имею в виду, если я объявляю« i = 10 », тогда мой результат равен 132. Кроме того, если я предоставляю значение «i», используя cin, результат равен 144 – user2413497

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