Thu, 15 Jan 2004 17:15:36 +0300 Yuriy K wrote to Harry Zhurov:
YK>>>>> ðÒÉ ÁËËÕÒÁÔÎÏÍ ÎÁÐÉÓÁÎÉÉ ÐÒÏÂÌÅÍ ÂÕÄÅÔ ÓÕÝÅÓÔ×ÅÎÎÏ ÍÅÎØÛÅ. HZ>>>> ðÒÉ ÞÅÍ ÔÕÔ "ÁËËÕÒÁÔÎÏÅ ÉÓÐÏÌØÚÏ×ÁÎÉÅ"?
HZ>> ÉÍÅÅÍ ÏÞÅÎØ ÐÒÏÓÔÏÊ ÍÁËÒÏÓ: HZ>> #define SQUARE(x) x*x
HZ>> int b = SQUARE(a + 2);
HZ>> ðÏÓÌÅ ÍÁËÒÏÐÏÄÓÔÁÎÏ×ËÉ ÐÏÌÕÞÉÍ: a + 2 * a + 2 => a + 2*a + 2 => 3*a + HZ>> 2, Á ÎÅ a*a + 2*a*2 + 2*2 => a*a + 4*a + 4
YK> ëÌÁÓÓÉÞÅÓËÉÊ ÐÒÉÍÅÒ ÎÅÐÒÁ×ÉÌØÎÏ ÎÁÐÉÓÁÎÎÏÇÏ ÍÁËÒÏÓÁ, ÚÁÍÅÞÁÔÅÌØÎÏ YK> ÐÏÄÔ×ÅÒÖÄÁÀÝÉÊ ÍÏÉ ÓÌÏ×Á. YK> éÍÅÎÎÏ Ï ÜÔÏÍ Ñ É ÇÏ×ÏÒÉÌ, ÞÔÏ ÐÉÓÁÔØ ÎÁÄÏ _ÁËËÕÒÁÔÎÏ_.
ôÙ, ËÁË ×ÓÑËÉÊ ÍÕÖÉË, ÚÁÄÎÉÍ ÕÍÏÍ ËÒÅÐÏË! ô.Å. ÏÂßÑÓÎÑÔØ ÐÒÉÞÉÎÕ ÐÒÏÉÚÏÛÅÄÛÅÇÏ ÔÙ ÇÏÒÁÚÄ!! îÏ ÅÓÔØ Õ×ÅÒÅÎÎÏÓÔØ, ÞÔÏ ËÏÇÄÁ ×ÏÚÎÉËÎÕÔ ÇÒÁÂÌÉ Ó ÍÁËÒÏÓÁÍÉ, ÔÏ ÔÙ, ËÁË É ×ÓÅ, ÂÌÁÇÏÐÏÌÕÞÎÏ ÎÁÓÔÕÐÉÛØ ÎÁ ÎÉÈ!!!
ñ ÔÅÂÅ ÐÒÉÎÃÉÐ ÐÒÏÄÅÍÏÎÓÔÒÉÒÏ×ÁÌ, Á ÔÙ × ÞÁÓÔÎÏÓÔÉ ÌÅÚÅÛØ... ìÁÄÎÏ, ÈÏÞÅÛØ ÂÙÔØ ÓÁÍ ÓÅÂÅ ÚÌÏÂÎÙÍ ÂÕÒÁÔÉÎÏÊ - ÂÕÄØ!
YK> #define SQUARE(x) ((x)*(x))
YK> ëÁË ÔÙ ÓÐÒÁ×ÅÄÌÉ×Ï ÚÁÍÅÔÉÌ, Ï ÜÔÏÍ ÎÁÐÉÓÁÎÏ ×Ï ×ÓÅÈ ÕÞÅÂÎÉËÁÈ.
÷ ÕÞÅÂÎÉËÁÈ ÎÅ ÜÔÏÔ ÐÒÉÍÅÒ ÐÒÉ×ÏÄÉÔÓÑ, Á ÐÒÉÍÅÒ Ó ÎÉÚËÏÐÒÉÏÒÉÔÅÔÎÙÍÉ ÏÐÅÒÁÃÉÑÍÉ ÔÉÐÁ:
#define doubling(x) x+x
ÇÄÅ ×Ï ÉÚÂÅÖÁÎÉÅ ÐÒÏÂÌÅÍ ÒÅËÏÍÅÎÄÕÀÔ ÓËÏÂËÉ ÉÓÐÏÌØÚÏ×ÁÔØ. á ÔÕÔ ÕÍÎÏÖÅÎÉÅ. üÔÏ ÒÁÚ.
÷Ï-×ÔÏÒÙÈ, ÏÎÏ ×ÓÅ ÒÁ×ÎÏ ÐÒÏÂÌÅÍ ÎÅ ÒÅÛÁÅÔ:
int a; int f() { a++; return a; };
void slon() { int b = SQUARE(f()); }
ðÏÌÕÞÉÛØ ÓÏ×ÓÅÍ ÎÅ ÔÏ, ÞÔÏ ÏÖÉÄÁÅÛØ! é ÇÒÁÂÌÅÊ ÔÁËÉÈ ÔÁÍ ÍÏÒÅ. é ÚÁÍÁÅÛØÓÑ ÏÂÏ ×ÓÅÍ ÐÏÍÎÉÔØ É "ÐÉÓÁÔØ ÁËËÕÒÁÔÎÏ". ôÅÍ ÂÏÌÅÅ, ÞÔÏ É ÔÁË ÅÓÔØ ÎÁ ÞÔÏ ÐÏÔÒÁÔÉÔØ ÕÓÉÌÉÑ É ÁËËÕÒÁÔÎÏÓÔØ.
HZ>> åÝÅ ÏÄÉÎ ÐÒÉÍÅÒ, ÔÏÖÅ ÏÞÅÎØ ÐÒÏÓÔÏÊ: HZ>> #define MAX(x, y) ((x) > (y) ? (x) : (y)) HZ>> int c = MAX(a, b++); HZ>> þÔÏ ÉÍÅÅÍ × ÓÌÕÞÁÅ ÍÁËÒÏÐÏÄÓÔÁÎÏ×ËÉ: HZ>> (a) > (b++) ? (a) : (b++)
HZ>> inline void max(int a, int b) { return x > y ? x : y; } HZ>> ÔÁËÉÈ ÇÒÁÂÌÅÊ ÇÁÒÁÎÔÉÒÏ×ÁÎÎÏ ÎÅÔ.
YK> úÁÍÅÔÉÍ, ÞÔÏ ÇÒÁÂÌÅÊ ÓÏ×ÓÅÍ ÎÅ ×ÏÚÎÉËÁÅÔ ÅÓÌÉ ÎÅ ÉÓÐÏÌØÚÏ×ÁÔØ ×ÙÒÁÖÅÎÉÑ Ó YK> side effects × ÁÒÇÕÍÅÎÔÁÈ ÍÁËÒÏÓÁ, ÞÔÏ ÓÁÍÏ ÐÏ ÓÅÂÅ ÈÏÒÏÛÉÊ ÔÏÎ.
á ÇÄÅ ÔÁÍ ×ÙÒÁÖÅÎÉÅ Ó side effects? éÎËÒÅÍÅÎÔ ÁÒÇÕÍÅÎÔÁ, ÞÔÏ ÌÉ? ôÕÔ ×ÓÅ ÎÏÒÍÁÌØÎÏ É ÞÅÔËÏ ÏÐÒÅÄÅÌÅÎÏ Ó ÔÏÞËÉ ÚÒÅÎÉÑ ÑÚÙËÁ - ÓÏÚÄÁÅÔÓÑ ËÏÐÉÑ 'b', ÐÏÔÏÍ 'b' ÉÎËÒÅÍÅÎÔÉÒÕÅÔÓÑ, ÐÏÔÏÍ ×ÙÚÙ×ÁÅÔÓÑ ÆÕÎËÃÉÑ, ËÏÔÏÒÏÊ ÐÅÒÅÄÁÅÔÓÑ ÔÁ ËÏÐÉÑ 'b'. üÔÏÔ ËÏÄ ÓÏ×ÅÒÛÅÎÎÏ ÌÅÇÁÌÅÎ, ÞÉÔÁÂÅÌÅÎ É ÕÄÏÂÅÎ. é ÚÁÄÎÉÃÁ ×ÏÚÎÉËÁÅÔ ÔÏÌØËÏ ÉÚ-ÚÁ ÍÁËÒÏÓÁ.
YK> ÷ Ô×ÏÅÍ ÓÌÕÞÁÅ, ×ÍÅÓÔÏ
HZ>> int c = MAX(a, b++);
YK> ÎÁÄÏ ÐÉÓÁÔØ
YK> int c = MAX(a, b); YK> b++;
÷ÏÏÂÝÅ-ÔÏ, ÎÅ ×ÓÅÇÄÁ ÍÏÖÎÏ ÔÁË ÓÄÅÌÁÔØ - 'b' ÓÁÍÁ ÐÏ ÓÅÂÅ ÍÏÖÅÔ ÉÓÐÏÌØÚÏ×ÁÔØÓÑ ×ÎÕÔÒÉ ÆÕÎËÃÉÉ, ËÕÄÁ ÐÅÒÅÄÁÎÏ ÅÅ ÚÎÁÞÅÎÉÅ, Ô.Þ. ÜÔÏ ÎÅÐÏÌÎÏÃÅÎÎÁÑ ÚÁÍÅÎÁ.
YK> úÁÏÄÎÏ ÉÓÈÏÄÎÙÊ ÔÅËÓÔ ÓÔÁÎÅÔ ÐÏÎÑÔÎÅÅ ÐÒÉÛÅÄÛÅÍÕ ÐÏÓÌÅ ÔÅÂÑ ÐÒÏÇÒÁÍÍÉÓÔÕ.
á-Á, ÎÕ ÅÓÌÉ × ÜÔÏÍ ÐÒÉÞÉÎÁ, ÔÏ ÔÏÇÄÁ ÓÔïÉÔ ÐÏÔÒÁÔÉÔØ ÕÓÉÌÉÑ ÎÁ ÏÂÕÞÅÎÉÅ ÜÔÏÇÏ ÐÒÏÇÒÁÍÍÉÓÔÁ, ÐÏÔÏÍÕ ËÁË ÅÓÌÉ ÕÖ ÏÎ ÔÁËÉÅ ×ÅÝÉ ÎÅ ÚÎÁÅÔ, ÔÏ ÞÔÏ ÏÎ ×ÏÏÂÝÅ ÚÎÁÅÔ?
÷ ÏÂÝÅÍ, Ô×ÏÉ ×ÏÚÒÁÖÅÎÉÑ ÄÁÖÅ ÎÁ ÏÔÍÁÚËÉ ÎÅ ÔÑÎÕÔ.
HZ>> üÔÉÈ ÐÒÉÍÅÒÏ×, ÄÕÍÁÀ, ÄÏÓÔÁÔÏÞÎÏ. ïÎÉ ÏÞÅÎØ ÐÒÏÓÔÙÅ É ÎÁÇÌÑÄÎÏ HZ>> ÉÌÌÀÓÔÒÉÒÕÀÔ ÓËÒÙÔÎÏÅ ÎÅÐÒÁ×ÉÌØÎÏÅ ÐÏ×ÅÄÅÎÉÅ, ×ÏÚÎÉËÁÀÝÉÅ ÏÔÎÀÄØ ÎÅ ÉÚ HZ>> ÓÌÏÖÎÏÓÔÉ ÍÁËÒÏÓÏ×, Á ÉÚ ÓÏÞÅÔÁÎÉÑ ÏÔÓÕÔÓÔ×ÉÑ ÐÒÏ×ÅÒËÉ ÐÒÁ×ÉÌ ÑÚÙËÁ É HZ>> ËÏÎÔÅËÔÓÁ ÉÓÐÏÌØÚÏ×ÁÎÉÑ.
YK> ôÏÞÎÅÅ ÏÎÉ ÐÏÄÔ×ÅÒÖÄÁÀÔ, ÞÔÏ ÍÁËÒÏÓÙ ÎÕÖÎÏ ÐÉÓÁÔØ É ÉÓÐÏÌØÚÏ×ÁÔØ YK> _ÁËËÕÒÁÔÎÏ_. ï ÞÅÍ Ñ É ÇÏ×ÏÒÉÌ.
ô.Å. ÉÈ ÌÕÞÛÅ ÎÅ ÉÓÐÏÌØÚÏ×ÁÔØ ÐÒÉ ÌÀÂÏÊ ×ÏÚÍÏÖÎÏÓÔÉ.
ôÙ, Ñ ×ÉÖÕ, × Ó×ÏÅÍ ÒÅÐÅÒÔÕÁÒÅ - ÕУÒÓÑ É ÎÉ × ËÁËÕÀ ÎÅ ÈÏÞÅÛØ ÐÒÉÚÎÁÔØ Ó×ÏÀ ÎÅÐÒÁ×ÏÔÕ ÄÁÖÅ × ÜÔÏÍ Ñ×ÎÏÍ ÓÌÕÞÁÅ. úÎÁÑ ÔÅÂÑ ÕÖÅ ÎÅ ÐÅÒ×ÙÊ ÇÏÄ, × ÏÞÅÒÅÄÎÏÊ ÒÁÚ ×ÉÖÕ, ÞÔÏ ÄÏËÁÚÙ×ÁÔØ ÄÁÖÅ Ó ÐÒÉÍÅÒÁÍÉ ÂÅÓÐÏÌÅÚÎÏ: ÈÏÞÅÛØ ÕÐÏÒÓÔ×Ï×ÁÔØ × Ó×ÏÅÊ ÎÅÐÒÁ×ÏÔÅ - Ô×ÏÅ ÐÒÁ×Ï, ÎÏ Õ ÍÅÎÑ ÂÏÌÅÅ ÎÅÔ ÎÉ ÓÉÌ, ÎÉ ×ÒÅÍÅÎÉ, ÎÉ ÖÅÌÁÎÉÑ ÕÞÁÓÔ×Ï×ÁÔØ × ÜÔÏÍ.