Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«C++Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 22

Автор Бтраустрап Π‘ΡŒΡΡ€Π½

if (iΒ«=0 !! maxΒ«i) // ...

ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, всСгда, ΠΊΠΎΠ³Π΄Π° программист сомнваСтся ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ этих ΠΏΡ€Π°Π²ΠΈΠ», слСдуСт ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Π»ΡΡ‚ΡŒ скобки, ΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ программисты ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°ΡŽΡ‚ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π±ΠΎΠ»Π΅Π΅ Π΄Π»ΠΈΠ½Π½ΠΎΠ΅ ΠΈ ΠΌΠ΅Π½Π΅Π΅ элСгантноС

if ( (iΒ«=0) !! (maxΒ«i) ) // ...

ΠŸΡ€ΠΈ услоТнСнии ΠΏΠΎΠ΄Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Π»Π΅Π½ΠΈΠ΅ скобок станвится Π±ΠΎΠ»Π΅Π΅ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ явлСниСм, Π½ΠΎ слоТныС подвыраТСния являюся источником ошибок, поэтому Ссли Π²Ρ‹ чувствуСтС ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΎΡΡ‚ΡŒ Π² скобках, ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ ΠΎΠ±ΠΎΡ€Π²Π°Ρ‚ΡŒ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ. Π•ΡΡ‚ΡŒ ΠΈ Ρ‚Π°ΠΊΠΈΠ΅ случаи, ΠΊΠΎΠ³Π΄Π° ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Ρ‚Ρ‹ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π½Π΅ приводят ΠΊ Β«ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎΠΌΡƒΒ» Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρƒ. НапримСр Π²

if (i amp;mask == 0) // ...

Π½Π΅ происходит примСнСния маски mask ΠΊ i ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° Π½Π° ноль. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ == ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ вшС, Ρ‡Π΅ΠΌ amp;, Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ интСрпрСтируСтся ΠΊΠ°ΠΊ i amp;(mask==0). Π’ этом случаС скобки ΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π²Π°ΠΆΠ½Ρ‹:

if ((i amp;mask) == 0) // ...

Но, с Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π½Π΅ Ρ€Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ Π½Π°ΠΈΠ²Π½Ρ‹ΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ, Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π·Π½Π°Ρ‡ΠΈΡ‚:

if (0 Β«= a Β«= 99) // ...

Оно допустимо, Π½ΠΎ интСрпрСтируСтся ΠΎΠ½ΠΎ ΠΊΠ°ΠΊ (0Β«=a)Β«=99, Π³Π΄Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ подвыраТСния ΠΈΠ»ΠΈ 0 ΠΈΠ»ΠΈ 1, Π½ΠΎ Π½Π΅ a (Ссли Ρ‚ΠΎΠ»ΡŒΠΊΠΎ a Π½Π΅ Ρ€Π°Π²Π½ΠΎ 1). Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, Π»Π΅ΠΆΠΈΡ‚ Π»ΠΈ a Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ 0...99, ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ

if (0Β«=a amp; amp; aΒ«=99) // ...

3.2.2 ΠŸΠΎΡ€ΡΠ΄ΠΎΠΊ вычислСния

ΠŸΠΎΡ€ΡΠ΄ΠΎΠΊ вычислСния ΠΏΠΎΠ΄Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ Π² Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½. НапримСр

int i = 1; v[i] = i++;

ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡ‚ΡŒΡΡ ΠΈΠ»ΠΈ ΠΊΠ°ΠΊ v[1]=1, ΠΈΠ»ΠΈ ΠΊΠ°ΠΊ v[2]=1. ΠŸΡ€ΠΈ отсутствии ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ Π½Π° порядок вычислСния выраТСния ΠΌΠΎΠΆΠ΅Ρ‚ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π±ΠΎΠ»Π΅Π΅ Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΉ ΠΊΠΎΠ΄. Π‘Ρ‹Π»ΠΎ Π±Ρ‹ Π·Π°ΠΌΠ΅Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Ссли Π±Ρ‹ компилятор ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π°Π» ΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… нСоднозначностях, Π½ΠΎ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ компиляторов этого Π½Π΅ Π΄Π΅Π»Π°ΡŽΡ‚.

ΠžΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ amp; amp; ΠΈ !! гарантируСтся, Ρ‡Ρ‚ΠΎ ΠΈΡ… Π»Π΅Π²Ρ‹ΠΉ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ вычисляСтся Ρ€Π°Π½ΡŒΡˆΠ΅, Ρ‡Π΅ΠΌ ΠΏΡ€Π°Π²Ρ‹ΠΉ. НапримСр, b=(a=2,a=1) присвоит b 3.Π’ #3.3.1приводятся ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ использования amp; amp; ΠΈ !!. Π—Π°ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ опСрация слСдования , (запятая) логичСски отличаСтся ΠΎΡ‚ запятой, которая ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для раздСлСния ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π² Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Рассмотрим

f1(v[i],i++); // Π΄Π²Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° f2( (v[i],i++) ) // ΠΎΠ΄ΠΈΠ½ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€

Π’ Π²Ρ‹Π·ΠΎΠ²Π΅ f1 Π΄Π²Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°, v[i] ΠΈ i++, ΠΈ порядок вычилСния Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ-ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½. Π—Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ выраТСния -ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΎΡ‚ порядка вычислСния – это ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠ»ΠΎΡ…ΠΎΠΉ ΡΡ‚ΠΈΠ»ΡŒ, Π° Ρ‚Π°ΠΊΠΆΠ΅ нСпСрСносимо. Π’ Π²Ρ‹Π·ΠΎΠ²Π΅ f2 ΠΎΠ΄ΠΈΠ½ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€, Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ с запятой, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ эквивалСнтно i++.

Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ скобок нСльзя Π·Π°Π΄Π°Ρ‚ΡŒ порядок вычислСния. НапримСр, a*(b/c) ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡ‚ΡŒΡΡ ΠΈ ΠΊΠ°ΠΊ (a*b)/c, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ * ΠΈ / ΠΈΠΌΠ΅ΡŽΡ‚ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΉ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚. Π’ Ρ‚Π΅Ρ… случаях, ΠΊΠΎΠ³Π΄Π° Π²Π°ΠΆΠ΅Π½ прядок вычислСния, ΠΌΠΎΠΆΠ½ΠΎ Π²Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, (t=b/c,a*t).

3.2.3 Π£Π²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ ΠΈ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΠ΅*

– * Π‘Π»Π΅Π΄ΠΎΠ²Π°Π»ΠΎ Π±Ρ‹ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊ Β«ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Β» ΠΈ Β«Π΄Π΅ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Β», ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΌΡ‹ слСдовали Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΎΠ»ΠΎΠ³ΠΈΠΈ, принятой Π² ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π½ΠΎΠΉ Π»ΠΈΡ‚Ρ€Π°Ρ‚ΡƒΡ€Π΅ ΠΏΠΎ C, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ эти ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ унаслСдованы ΠΎΡ‚ C. (ΠΏΡ€ΠΈΠΌ. ΠΏΠ΅Ρ€Π΅Π².)

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ ++ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для явного выраТСния приращСния вмСсто Π΅Π³ΠΎ нСявного выраТСния с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ слоТСния ΠΈ присваивания. По ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡŽ ++lvalue ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ lvalue+=1, Ρ‡Ρ‚ΠΎ Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ lvalue=lvalue+1 ΠΏΡ€ΠΈ условии, Ρ‡Ρ‚ΠΎ lvalue Π½Π΅ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹Ρ… эффСктов. Π’Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‰Π΅Π΅ (Π΄Π΅Π½ΠΎΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅Π΅) ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ²Π»ΠΈΡ‡Π΅Π½, вычисляСтся ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· (Ρ‚ΠΎΠ»ΡŒΠΊΠΎ). Аналогично, ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΠ΅ выраТаСтся ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠ΅ΠΉ –. ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ++ ΠΈ – ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ ΠΈ ΠΊΠ°ΠΊ прСфиксныС, ΠΈ ΠΊΠ°ΠΊ постфиксныС. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ ++x являСтся Π½Π²ΠΎΠ΅ (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½Π½ΠΎΠ΅) Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ x. НапримСр, y=++x эквивлСнтно y=(x+=1). Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ x++, Π½Π°ΠΏΡ€ΠΎΡ‚ΠΈΠ², Π΅ΡΡ‚ΡŒ староС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ x. НапримСр, y=x++ эквивалСнтно y=(t=x,x+=1,t), Π³Π΄Π΅ t – пСрмСнная Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ Ρ‚ΠΈΠΏΠ°, Ρ‡Ρ‚ΠΎ ΠΈ x.

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ приращСния особСнно ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ для увСличСния ΠΈ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΡ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π² Ρ†ΠΈΠΊΠ»Π°Ρ…. НапримСр, ΠΎΠΊΠ°Π½Ρ‡ΠΈΠ²Π°ΡŽΡ‰ΡƒΡŽΡΡ Π½Π»Π΅ΠΌ строку ΠΌΠΎΠΆΠ½ΠΎ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ:

inline void cpy(char* p, const char* q) (* while (*p++ = *q++) ; *)

Напомню, Ρ‡Ρ‚ΠΎ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ ΠΈ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΠ΅ арифмСтичСских ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ, Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΊΠ°ΠΊ слоТСниС ΠΈ Π²Ρ‹Ρ‡ΠΈΡ‚Π°Π½ΠΈΠ΅ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ, осущСствляСтся Π² Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Ρ… элСмСнтов Π²Π΅ΠΊΡ‚ΠΎΡ€Π°, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ p++ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ p ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ элСмСнт. Для указатСля p Ρ‚ΠΈΠΏΠ° T* ΠΏΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡŽ выполняСтся ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

long(p+1) == long(p)+sizeof(T);

3.2.4 ΠŸΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ логичСскиС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ

ΠŸΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ логичСскиС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ

amp; ! ^ ~ »» ««

ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ ΠΊ Ρ†Π΅Π»Ρ‹ΠΌ, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ Ρ‚ΠΈΠΏΠ° char, short, int, long ΠΈ ΠΈΡ… unsigned Π°Π½Π°Π»ΠΎΠ³Π°ΠΌ, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Ρ‚ΠΎΠΆΠ΅ Ρ†Π»Ρ‹Π΅.

Одно ΠΈΠ· стандартных ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΉ ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹Ρ… логичСских ΠΎΠΏΡ€Π°Ρ†ΠΈΠΉ – рСализация малСнького мноТСства (Π²Π΅ΠΊΡ‚ΠΎΡ€ Π±ΠΈΡ‚ΠΎΠ²). Π’ этом случаС ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Π±ΠΈΡ‚ Π±Π΅Π·Π·Π½Π°ΠΊΠΎΠ²ΠΎΠ³ΠΎ Ρ†Π΅Π»ΠΎΠ³ΠΎ прСдставляСт ΠΎΠ΄ΠΈΠ½ Ρ‡Π»Π΅Π½ мноТСства, Π° число Ρ‡Π»Π΅Π½ΠΎΠ² ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΎ числом Π±ΠΈΡ‚ΠΎΠ². Бнарная опСрация amp; интСрпрСтируСтся ΠΊΠ°ΠΊ пСрСсСчСниС, ! ΠΊΠ°ΠΊ объСдинСниС, Π° ^ ΠΊΠ°ΠΊ Ρ€Π°Π·Π½ΠΎΡΡ‚ΡŒ. Для наимСнования Ρ‡Π»Π΅Π½ΠΎΠ² Ρ‚Π°ΠΊΠΎΠ³ΠΎ мноТСства ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ пСрСчислСниС. Π’ΠΎΡ‚ малСнький ΠΏΡ€ΠΌΠ΅Ρ€, заимствованный ΠΈΠ· Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ (Π½Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ итСрфСйса) Β«stream.hΒ»:

enum state_value (* _good=0, _eof=1, _fail=2, _bad=4 *); // Ρ…ΠΎΡ€ΠΎΡˆΠΎ, ΠΊΠΎΠ½Π΅Ρ† Ρ„Π°ΠΉΠ»Π°, ошибка, ΠΏΠ»ΠΎΡ…ΠΎ

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ _good Π½Π΅ являСтся Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΌ. Π― просто Ρ…Ρ‚Π΅Π», Ρ‡Ρ‚ΠΎΠ±Ρ‹ состояниС, ΠΊΠΎΠ³Π΄Π° всС Π² порядкС, ΠΈΠΌΠ΅Π»ΠΎ подходящСС имя. БостояниС ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΌΠΎΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π·Π°Π½ΠΎΠ²ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π·ΠΎΠΌ:

cout.state = _good;

НапримСр, Ρ‚Π°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, Π½Π΅ Π±Ρ‹Π» Π»ΠΈ испорчСн ΠΏΠΎΡ‚ΠΎΠΊ ΠΈΠ»ΠΈ Π΄ΠΎΠΏΡƒΡ‰Π΅Π½Π° опСрационная ошибка:

if (cout.state amp;(_bad!_fail)) // Π½Π΅ good

Π•Ρ‰Π΅ ΠΎΠ΄Π½ΠΈ скобки Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ amp; ΠΈΠΌΠ΅Π΅Ρ‚ Π±ΠΎΠ»Π΅Π΅ всокий ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚, Ρ‡Π΅ΠΌ !.

Ѐункция, Π΄ΠΎΡΡ‚ΠΈΠ³Π°ΡŽΡ‰Π°Ρ ΠΊΠΎΠ½Ρ†Π° Π²Π²ΠΎΠ΄Π°, ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠΎΠ±Ρ‰Π°Ρ‚ΡŒ ΠΎΠ± этом Ρ‚Π°ΠΊ:

cin.state != _eof;

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ != ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΡ‚ΠΎΠΊ ΡƒΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ испорчСн (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ, state==_bad), поэтому

cin.state = _eof;

очистило Π±Ρ‹ этот ΠΏΡ€ΠΈΠ·Π½Π°ΠΊ. Π Π°Π·Π»ΠΈΡ‡ΠΈΠ΅ Π΄Π²ΡƒΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊ:

state_value diff = cin.state^cout.state;

Π’ случаС Ρ‚ΠΈΠΏΠ° stream_state (состояниС ΠΏΠΎΡ‚ΠΎΠΊΠ°) такая Ρ€Π°Π½ΠΎΡΡ‚ΡŒ Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ Π½ΡƒΠΆΠ½Π°, Π½ΠΎ для Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΠΎΡ…ΠΎΠΆΠΈΡ… Ρ‚ΠΈΠΏΠΎΠ² ΠΎΠ½Π° оказваСтся самой ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ. НапримСр, ΠΏΡ€ΠΈ сравнСнии Π²Π΅ΠΊΡ‚ΠΎΡ€Π° Π±ΠΈΡ‚, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π΅Π³ΠΎ мноТСство ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ, с Π΄Ρ€ΡƒΠ³ΠΈΠΌ, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠΌ прСрывания, ΠΆΠ΄ΡƒΡ‰ΠΈΠ΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ.

Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ использованиС ΠΏΠΎΠ»Π΅ΠΉ (#2.5.1) Π² Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ являСтся сокращСнной записью сдвига ΠΈ маскрования для извлСчСния ΠΏΠΎΠ»Π΅ΠΉ Π±ΠΈΡ‚ ΠΈΠ· слова. Π­Ρ‚ΠΎ, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, ΠΌΠΎΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹Ρ… логичСских ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ, НапримСр, ΠΈΠ·Π²Π»Π΅Ρ‡ΡŒ срСдниС 16 Π±ΠΈΡ‚ ΠΈΠ· 32-Π±ΠΈΡ‚ΠΎΠ²ΠΎΠ³ΠΎ int ΠΌΠΎΠΆΠ½ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

unsigned short middle(int a) (* return (a»»8) amp;0xffff; *)

НС ΠΏΡƒΡ‚Π°ΠΉΡ‚Π΅ ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ логичСскиС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ с логичСскими опСрациями:

amp; amp; !! !

ПослСдниС Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ 0 ΠΈΠ»ΠΈ 1, ΠΈ ΠΎΠ½ΠΈ Π³Π»Π°Π²Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΈΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для записи ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π² ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°Ρ… if, while ΠΈΠ»ΠΈ for (#3.3.1). НапримСр, !0 (Π½Π΅ ноль) Π΅ΡΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 1, Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ ~ 0 (Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ нуля) Π΅ΡΡ‚ΡŒ Π½Π°Π±ΠΎΡ€ Π±ΠΈΡ‚ΠΎΠ² всС-Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ являСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ -1.

3.2.5 ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ°

Π‘Ρ‹Π²Π°Π΅Ρ‚ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ явно ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ‚ΠΏΠ° Π² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ. Π―Π²Π½ΠΎΠ΅ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° Π΄Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° для Π΄Π°Π½Π½ΠΎΠ³ΠΎ значСния Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°. НапримСр:

float r = float(1);

ΠΏΠ΅Ρ€Π΅Π΄ присваиваниСм ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ Ρ†Π΅Π»ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 1 ΠΊ Π·Π½Ρ‡Π΅Π½ΠΈΡŽ с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ 1.0. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ прСобразования Ρ‚ΠΈΠΏΠ° Π½Π΅ являСтся lvalue, поэтому Π΅ΠΌΡƒ нСльзя ΠΏΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Ρ‚ΡŒ (Ссли Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΈΠΏ Π½Π΅ являСтся ссылочным Ρ‚ΠΈΠΏΠΎΠΌ).

Π•ΡΡ‚ΡŒ Π΄Π²Π° способа записи явного прСобразования Ρ‚ΠΈΠΏΠ°: трдиционная Π² C запись привСдСния ΠΊ Ρ‚ΠΈΠΏΡƒ (double)a ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ½Π°Π»ΡŒΠ½Π°Ρ запись double(a). Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Π°Ρ запись Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ для Ρ‚ΠΈΠΏΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ простого ΠΈΠΌΠ΅Π½ΠΈ. НапримСр, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΌΡƒ Ρ‚ΠΈΠΏΡƒ Π½Π°Π΄ΠΎ ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ запись прСобразования Ρ‚ΠΈΠΏΠ°

char* p = (char*)0777;

ΠΈΠ»ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π½ΠΎΠ²ΠΎΠ΅ имя Ρ‚ΠΈΠΏΠ°:

typedef char* Pchar; char* p = Pchar(0777);

По ΠΌΠΎΠ΅ΠΌΡƒ мнСнию, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Π°Ρ запись Π² Π½Π΅Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… случаях ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚ΠΈΡ‚Π΅Π»ΡŒΠ½Π°. Рассмотрим Π΄Π²Π° эквивалСнтных ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°