#include <iostream>
using namespace std;
#define SQUARE(x) x*x // Macro with argument
inline int square(int x) { return x*x; } // inline function
int main() {
cout << SQUARE(5) << endl; // expand to 5*5 (25)
int x = 2, y = 3;
cout << SQUARE(x) << endl; // expand to x*x (4)
// Problem with the following macro expansions
cout << SQUARE(5+5) << endl; // expand to 5+5*5+5 - wrong answer
cout << square(5+5) << endl; // Okay square(10)
cout << SQUARE(x+y) << endl; // expand to x+y*x+y - wrong answer
cout << square(x+y) << endl; // Okay
// can be fixed using #define SQUARE(x) (x)*(x)
cout << SQUARE(++x) << endl; // expand to ++x*++x (16) - x increment twice
cout << x << endl; // x = 4
cout << square(++y) << endl; // Okay ++y, (y*y) (16)
cout << y << endl; // y = 4
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwogCiNkZWZpbmUgU1FVQVJFKHgpIHgqeCAgICAgLy8gTWFjcm8gd2l0aCBhcmd1bWVudAogCmlubGluZSBpbnQgc3F1YXJlKGludCB4KSB7IHJldHVybiB4Kng7IH0gIC8vIGlubGluZSBmdW5jdGlvbgogCmludCBtYWluKCkgewogICBjb3V0IDw8IFNRVUFSRSg1KSA8PCBlbmRsOyAgLy8gZXhwYW5kIHRvIDUqNSAoMjUpCiAgIGludCB4ID0gMiwgeSA9IDM7CiAgIGNvdXQgPDwgU1FVQVJFKHgpIDw8IGVuZGw7ICAvLyBleHBhbmQgdG8geCp4ICg0KQogCiAgIC8vIFByb2JsZW0gd2l0aCB0aGUgZm9sbG93aW5nIG1hY3JvIGV4cGFuc2lvbnMKICAgY291dCA8PCBTUVVBUkUoNSs1KSA8PCBlbmRsOyAgIC8vIGV4cGFuZCB0byA1KzUqNSs1IC0gd3JvbmcgYW5zd2VyCiAgIGNvdXQgPDwgc3F1YXJlKDUrNSkgPDwgZW5kbDsgICAvLyBPa2F5IHNxdWFyZSgxMCkKICAgY291dCA8PCBTUVVBUkUoeCt5KSA8PCBlbmRsOyAgIC8vIGV4cGFuZCB0byB4K3kqeCt5IC0gd3JvbmcgYW5zd2VyCiAgIGNvdXQgPDwgc3F1YXJlKHgreSkgPDwgZW5kbDsgICAvLyBPa2F5CiAgICAgIC8vIGNhbiBiZSBmaXhlZCB1c2luZyAjZGVmaW5lIFNRVUFSRSh4KSAoeCkqKHgpCiAKICAgY291dCA8PCBTUVVBUkUoKyt4KSA8PCBlbmRsOyAgIC8vIGV4cGFuZCB0byArK3gqKyt4ICgxNikgLSB4IGluY3JlbWVudCB0d2ljZQogICBjb3V0IDw8IHggPDwgZW5kbDsgICAgICAgICAgICAgLy8geCA9IDQKICAgY291dCA8PCBzcXVhcmUoKyt5KSA8PCBlbmRsOyAgIC8vIE9rYXkgKyt5LCAoeSp5KSAoMTYpCiAgIGNvdXQgPDwgeSA8PCBlbmRsOyAgICAgICAgICAgICAvLyB5ID0gNAp9CiA=