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

ужно понять, как работает этот код:

#define foo1( a ) (a * a)              // How does this work?
inline int foo2( int a ) { return (a * a); }
int goo1( int x ) { return foo1(foo2(x)); }
int goo2( int& x ) { return x = foo2(foo1(x)); }
int goo3( int& x, int y ) { return foo2(foo1(y + 1)); }
void goo4( int& x, int y ) { x = foo1(foo2(y + 1)); }

int main(){
int i = 2, j = 1, a = 2+3;

cout << "foo1 = " << foo1( 1+2 ) << "\n";  // How does this work?
cout << "foo2 = " << foo2( 2 + 1 ) << "\n";
cout << "goo1 = " << goo1( i ) << "\n";
cout << "goo2 = " << goo2( j ) << "\n";
cout << "goo3 = " << goo3( i, j ) << "\n";  // How does this work?
goo4( i, j );
cout << " i = " << i << " j = " << j << "\n";
}

Но я, кажется, не в состоянии понять поведение этой функции:

#define foo1( a ) (a * a)

и поэтому я не понимаю вывод этих двух вызовов функций:

foo1( 1+2 )
goo3( i, j )

Это вывод программы:

foo1 = 5
foo2 = 9
goo1 = 16
goo2 = 1
goo3 = 9
 i = 16 j = 1

Я не понимаю, почему foo1 не ведет себя как foo2. Кто-нибудь объяснит мне, как работает этот макрос #define?

ПРИМЕЧАНИЕ: я не должен менять код, я только пытаюсь понять вывод.

 pm10001 нояб. 2017 г., 00:59
пытаться#define foo1( a ) ((a) *( a)) если вы должны использовать определяет
 pm10001 нояб. 2017 г., 00:58
вот почему вы делаете встроенные функции, а не #defines
 siama01 нояб. 2017 г., 01:03
Мне дали этот код, и мне нужно только понять вывод, поэтому я не могу его изменить. @ PM100
 siama01 нояб. 2017 г., 01:01
Я получаю ожидаемый результат, когда я вызываю его только с одним int, напримерfoo(5) даст мне 25, что просто 5 * 5. Но почему вывод foo1 (1 + 2) не 9 (то есть 3 * 3)?
 Hans Passant01 нояб. 2017 г., 01:01
#define foo1 (a) ((a) * (a)). Вы не жили макросами, пока не узнали C и не научились их использовать.

Ответы на вопрос(4)

Макросы заменяют текст. Итак, когда у вас есть

#define foo1( a )   (a * a)

любой случайfoo1( ...) с чем-то между, тогда круглые скобки будут расширены как текст, а не как выражение. Итак, когда у вас естьfoo1( 1 + 2 ) превращается в( 1 + 2 * 1 + 2 )

 siama01 нояб. 2017 г., 01:08
Ну, спасибо вам большое! Это было намного проще, чем я думал.

НЕ функция, пока foo2 есть.

В процессе компиляции компилятор заменит ключевое слово foo1 (параметр) в вашем коде на (параметр * параметр).

Смысл,

cout << "foo1 = " << foo1( 1+2 ) << "\n"; // How does this work?

будет заменен следующим кодом,

cout << "foo1 = " << ( 1+2 * 1+2 ) << "\n"; // How does this work?

(Потому что параметр здесь 1 + 2, а не 3.)

Результат равен 1 + 2 * 1 + 2, что составляет 5.

Теперь давайте посмотрим на foo2, так как этовстроенная функция, компилятор не заменит его. Когда ваш код скомпилирован в исполняемый файл и исполняемый файл выполняется,2 + 1 Сначала будет вычислено выражение, а затем результат 3 будет передан в foo2 ().

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

Ну, это действительно просто.

foo1( 1 + 2 )

превратится в:

( 1 + 2 * 1 + 2 )

что на самом деле:

1 + 2 + 2 = 5

Вот как работают макросы.

скомпилирует его. Чтобы увидеть расширенный код, вы можете использовать следующую команду, используя опцию -E в gcc:

gcc -E <source code> -o <preprocessed file name>

Или в Visual C ++ в разделе Свойства конфигурации-> C / C ++ -> препроцессор установите «Создать предварительно обработанный файл».

Кстати, ваш макрос проблематичен. Вы должны использовать

#define foo1( a ) ((a) * (a))

вместо

 #define foo1( a ) (a * a)
 siama01 нояб. 2017 г., 03:52
Спасибо. Мне только дали этот код, чтобы понять, что он делает, я знаю, что макрос проблематичен, но он предназначен для обучения :)

Ваш ответ на вопрос