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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π―Π·Ρ‹ΠΊ программирования C++. ΠŸΡΡ‚ΠΎΠ΅ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 52

Автор Π‘Ρ‚Π΅Π½Π»ΠΈ Π›ΠΈΠΏΠΏΠΌΠ°Π½

Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΠ°Ρ€Π½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ², присвоСниС ΠΈΠΌΠ΅Π΅Ρ‚ правосторонний порядок:

int ival, jval;

ival = jval = 0; // ok: ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ присвоСно Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 0

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ присвоСниС ΠΈΠΌΠ΅Π΅Ρ‚ правосторонний порядок, Π΅Π³ΠΎ крайняя правая Ρ‡Π°ΡΡ‚ΡŒ, jval = 0, являСтся ΠΏΡ€Π°Π²Ρ‹ΠΌ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ΠΎΠΌ ΠΊΡ€Π°ΠΉΠ½Π΅Π³ΠΎ Π»Π΅Π²ΠΎΠ³ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° присвоСния. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ присвоСниС Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ свой Π»Π΅Π²Ρ‹ΠΉ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΊΡ€Π°ΠΉΠ½Π΅Π³ΠΎ ΠΏΡ€Π°Π²ΠΎΠ³ΠΎ присвоСния (Ρ‚.Π΅. jval) присваиваСтся ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ival.

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π² мноТСствСнном ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π΅ присвоСния Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ‚ΠΈΠΏ, ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‰ΠΈΠΉ с Ρ‚ΠΈΠΏΠΎΠΌ сосСда справа, ΠΈΠ»ΠΈ Π΄ΠΎΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π² Π½Π΅Π³ΠΎ (Ρ€Π°Π·Π΄Π΅Π» 4.11):

int ival, *pval; // ival ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ int; pval ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ указатСля Π½Π° int

ival = pval = 0; // ошибка: ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Ρ‚ΠΈΠΏΠ° int нСльзя ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ

                 // Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ указатСля

string s1, s2;

s1 = s2 = "OK";  // строковый Π»ΠΈΡ‚Π΅Ρ€Π°Π» "OK" ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ Π² строку

ΠŸΠ΅Ρ€Π²ΠΎΠ΅ присвоСниС Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ival ΠΈ pval ΠΈΠΌΠ΅ΡŽΡ‚ Ρ€Π°Π·Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ ΠΈ Π½Π΅ сущСствуСт прСобразования Ρ‚ΠΈΠΏΠ° int* (pval) Π² Ρ‚ΠΈΠΏ int (ival). Оно Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ, нСсмотря Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½ΡƒΠ»ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ присвоСно Π»ΡŽΠ±ΠΎΠΌΡƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ.

Π’Ρ‚ΠΎΡ€ΠΎΠ΅ присвоСниС, Π½Π°ΠΏΡ€ΠΎΡ‚ΠΈΠ², Π²ΠΏΠΎΠ»Π½Π΅ допустимо. Π‘Ρ‚Ρ€ΠΎΠΊΠΎΠ²Ρ‹ΠΉ Π»ΠΈΡ‚Π΅Ρ€Π°Π» прСобразуСтся Π² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° string, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΈ присваиваСтся ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ s2 Ρ‚ΠΈΠΏΠ° string. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ этого присвоСния β€” строка s2 β€” ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΎΡ‚ ΠΆΠ΅ Ρ‚ΠΈΠΏ, Ρ‡Ρ‚ΠΎ ΠΈ строка s1.

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ присвоСния ΠΈΠΌΠ΅Π΅Ρ‚ Π½ΠΈΠ·ΠΊΠΈΠΉ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚

ΠŸΡ€ΠΈΡΠ²ΠΎΠ΅Π½ΠΈΡ Π½Π΅Ρ€Π΅Π΄ΠΊΠΎ происходят Π² условиях. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ присвоСния ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½ΠΈΠ·ΠΊΠΈΠΉ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚, Π΅Π³ΠΎ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π·Π°ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ Π² скобки, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ Ρ€Π°Π±ΠΎΡ‚Π°Π» ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Π΅ΠΌ присвоСниС ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π² условии, рассмотрим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ†ΠΈΠΊΠ». Π—Π΄Π΅ΡΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° ΠΎΠ½Π° Π½Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ ΠΆΠ΅Π»Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, скаТСм 42.

// ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Ρ‹ΠΉ, Π° ΠΏΠΎΡ‚ΠΎΠΌΡƒ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Π²Π΅Ρ€ΠΆΠ΅Π½Π½Ρ‹ΠΉ ошибкам

// ΡΠΏΠΎΡΠΎΠ± написания Ρ†ΠΈΠΊΠ»Π°

int i = get_value(); // ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅

while (i != 42) {

 // Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ дСйствия ...

 i = get_value(); // ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ значСния

}

Код начинаСтся с Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ get_value(), Π·Π°Ρ‚Π΅ΠΌ слСдуСт Ρ†ΠΈΠΊΠ», условиС ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Π½ΠΎΠ΅ этим Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ. ПослСдним ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ этого Ρ†ΠΈΠΊΠ»Π° являСтся Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ get_value(), Π΄Π°Π»Π΅Π΅ Ρ†ΠΈΠΊΠ» повторяСтся. Π­Ρ‚ΠΎΡ‚ ΠΊΠΎΠ΄ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΠ°Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ нСпосрСдствСнно:

int i;

// Π»ΡƒΡ‡ΡˆΠΈΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Ρ†ΠΈΠΊΠ»Π°, Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π²ΠΏΠΎΠ»Π½Π΅ понятно, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ условиС

while ((i = get_value()) != 42) {

 // Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ дСйствия ...

}

Π’Π΅ΠΏΠ΅Ρ€ΡŒ условиС Π²ΠΏΠΎΠ»Π½Π΅ ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½ΠΎ Π²Ρ‹Ρ€Π°ΠΆΠ°Π΅Ρ‚ Π½Π°ΠΌΠ΅Ρ€Π΅Π½ΠΈΠ΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°: Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ΡŒ, ΠΏΠΎΠΊΠ° функция get_value() Π½Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 42. Π’ Ρ…ΠΎΠ΄Π΅ вычислСния условия Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ get_value() присваиваСтся ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ i, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π·Π°Ρ‚Π΅ΠΌ сравниваСтся со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ 42.

Π‘Π΅Π· ΠΊΡ€ΡƒΠ³Π»Ρ‹Ρ… скобок ΠΎΠΏΠ΅Ρ€Π°Π½Π΄Π°ΠΌΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° != Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Π½ΠΎΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ get_value() ΠΈ 42, Π° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ (true ΠΈΠ»ΠΈ false) Π±Ρ‹Π» Π±Ρ‹ присвоСн ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ i, Ρ‡Π΅Π³ΠΎ явно Π½Π΅ ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Π»ΠΎΡΡŒ!

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° присвоСния Π½ΠΈΠΆΠ΅, Ρ‡Π΅ΠΌ Ρƒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡ, ΠΊΡ€ΡƒΠ³Π»Ρ‹Π΅ скобки Π²ΠΎΠΊΡ€ΡƒΠ³ присвоСний Π² условиях ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹.

НС ΠΏΠ΅Ρ€Π΅ΠΏΡƒΡ‚Π°ΠΉΡ‚Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ равСнства ΠΈ присвоСния

Π’ΠΎΡ‚ Ρ„Π°ΠΊΡ‚, Ρ‡Ρ‚ΠΎ присвоСниС Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π² условии, Π·Π°Ρ‡Π°ΡΡ‚ΡƒΡŽ ΠΈΠΌΠ΅Π΅Ρ‚ ΡƒΠ΄ΠΈΠ²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ послСдствия:

if (i = j)

УсловиС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° if присваиваСт Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ j ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ i, Π° Π·Π°Ρ‚Π΅ΠΌ провСряСт Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ присвоСния. Если Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ j ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎ ΠΎΡ‚ нуля, Ρ‚ΠΎ условиС истинно. Однако Π°Π²Ρ‚ΠΎΡ€ этого ΠΊΠΎΠ΄Π° ΠΏΠΎΡ‡Ρ‚ΠΈ навСрняка намСрСвался ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ равСнство Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… i ΠΈ j Ρ‚Π°ΠΊ:

if (i == j)

Ошибки Ρ‚Π°ΠΊΠΎΠ³ΠΎ Ρ€ΠΎΠ΄Π° Ρ…ΠΎΡ‚ΡŒ ΠΈ извСстны, Π½ΠΎ Ρ‚Ρ€ΡƒΠ΄Π½Ρ‹ для обнаруТСния. НСкоторыС, Π½ΠΎ Π½Π΅ всС компиляторы достаточно "Π»ΡŽΠ±Π΅Π·Π½Ρ‹", Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅Π΄ΠΈΡ‚ΡŒ ΠΎ Ρ‚Π°ΠΊΠΎΠΌ ΠΊΠΎΠ΄Π΅, ΠΊΠ°ΠΊ Π² этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅.

БоставныС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ присвоСния

Π”ΠΎΠ²ΠΎΠ»ΡŒΠ½ΠΎ Π½Π΅Ρ€Π΅Π΄ΠΊΠΈ случаи, ΠΊΠΎΠ³Π΄Π° ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ примСняСтся ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ, Π° ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ присваиваСтся Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ. Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° рассмотрим ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ΠΈΠ· Ρ€Π°Π·Π΄Π΅Π»Π° 1.4.2:

int sum = 0;

// ΡΠ»ΠΎΠΆΠΈΡ‚ΡŒ числа ΠΎΡ‚ 1 Π΄ΠΎ 10 Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ

for (int val = 1; val <= 10; ++val)

 sum += val; // эквивалСнтно sum = sum + val

ΠŸΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΉ Π²ΠΈΠ΄ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€Π΅Π½ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для слоТСния, Π½ΠΎ ΠΈ для Π΄Ρ€ΡƒΠ³ΠΈΡ… арифмСтичСских ΠΈ ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 4.8. Π‘ΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ составныС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ присвоСния (compound assignment) ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· этих ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ².

 +=  -= *= /= %= // арифмСтичСскиС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹

<<= >>= &= ^= |= // ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹; см. p. 4.8

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ составной ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΏΠΎ сути эквивалСнтСн ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΌΡƒ, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ, ΠΊΠΎΠ³Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ составноС присвоСниС, Π»Π΅Π²Ρ‹ΠΉ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ обрабатываСтся (оцСниваСтся) Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½Π°ΠΆΠ΄Ρ‹.

Но эти Ρ„ΠΎΡ€ΠΌΡ‹ ΠΈΠΌΠ΅ΡŽΡ‚ ΠΎΠ΄Π½ΠΎ ΠΎΡ‡Π΅Π½ΡŒ Π²Π°ΠΆΠ½ΠΎΠ΅ Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠ΅: Π² составном ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π΅ присвоСния Π»Π΅Π²Ρ‹ΠΉ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ вычисляСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·. По сущСству, ΠΎΠ½ эквивалСнтСн ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ:

Π° = Π° ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ b;

Если ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ΅ присвоСниС, ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ Π° обрабатываСтся Π΄Π²Π°ΠΆΠ΄Ρ‹: ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· Π² Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ с ΠΏΡ€Π°Π²ΠΎΠΉ стороны ΠΈ Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΉ Ρ€Π°Π· β€” ΠΊΠ°ΠΊ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ слСва. Π’ ΠΏΠΎΠ΄Π°Π²Π»ΡΡŽΡ‰Π΅ΠΌ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв это Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠ΅ нСсущСствСнно, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΊΡ€ΠΎΠΌΠ΅ Ρ‚Π΅Ρ…, Π³Π΄Π΅ критичСски Π²Π°ΠΆΠ½Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ.

УпраТнСния Ρ€Π°Π·Π΄Π΅Π»Π° 4.4

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 4.13. ΠšΠ°ΠΊΠΎΠ²Ρ‹ значСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… i ΠΈ d послС ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ присвоСния?

int i; double d;

(a) d = i = 3.5; (b) i = d = 3.5;

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 4.14. ΠžΠ±ΡŠΡΡΠ½ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ происходит Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΈΠ· ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² if?

if (42 = i) // ...

if (i = 42) // ...

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 4.15. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ присвоСниС нСдопустимо. ΠŸΠΎΡ‡Π΅ΠΌΡƒ? Как ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ?

double dval; int ival; int *pi;

dval = ival = pi = 0;

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 4.16. Π₯отя Π½ΠΈΠΆΠ΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ Π²ΠΏΠΎΠ»Π½Π΅ допустимыС выраТСния, ΠΈΡ… ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ Π½Π΅ Ρ‚Π°ΠΊΠΈΠΌ, ΠΊΠ°ΠΊ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π»ΠΎΡΡŒ. ΠŸΠΎΡ‡Π΅ΠΌΡƒ? ΠŸΠ΅Ρ€Π΅ΠΏΠΈΡˆΠΈΡ‚Π΅ выраТСния Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ΠΈ стали Π±ΠΎΠ»Π΅Π΅ понятными.

(a) if (p = getPtr() != 0)

(b) if (i = 1024)

4.5. ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π° ΠΈ Π΄Π΅ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π°

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π° (++) ΠΈ Π΄Π΅ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π° (--) ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π² ΠΊΡ€Π°Ρ‚ΠΊΠΎΠΉ ΠΈ ΡƒΠ΄ΠΎΠ±Π½ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΠ΅ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΈΠ»ΠΈ Π²Ρ‹Ρ‡Π΅ΡΡ‚ΡŒ Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ ΠΈΠ· ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Π­Ρ‚Π° Ρ„ΠΎΡ€ΠΌΠ° записи обСспСчиваСт Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ удобство, ΠΎΠ½Π° вСсьма популярна ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°ΠΌΠΈ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ арифмСтичСских дСйствий.

Π­Ρ‚ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Π² Π΄Π²ΡƒΡ… Ρ„ΠΎΡ€ΠΌΠ°Ρ…: прСфиксной ΠΈ постфиксной. Π”ΠΎ сих ΠΏΠΎΡ€ использовался Ρ‚ΠΎΠ»ΡŒΠΊΠΎ прСфиксный ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π° (prefix increment). Он осущСствляСт ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ (ΠΈΠ»ΠΈ Π΄Π΅ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚) своСго ΠΎΠΏΠ΅Ρ€Π°Π½Π΄Π° ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΊΠ°ΠΊ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚. ΠŸΠΎΡΡ‚Ρ„ΠΈΠΊΡΠ½Ρ‹ΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π° (postfix increment) (ΠΈΠ»ΠΈ Π΄Π΅ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π°) Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ копию ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄Π° Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½ΠΎΠΉ, Π° Π·Π°Ρ‚Π΅ΠΌ измСняСт Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄Π°.

int i = 0, j;

j = ++i; // j = 1, i = 1: прСфикс Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅

j = i++; // j = 1, i = 2: постфикс Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ исходноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅

ΠžΠΏΠ΅Ρ€Π°Π½Π΄Π°ΠΌΠΈ этих ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ l-значСния. ΠŸΡ€Π΅Ρ„ΠΈΠΊΡΠ½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ сам ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΊΠ°ΠΊ l-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. ΠŸΠΎΡΡ‚Ρ„ΠΈΠΊΡΠ½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ копию исходного значСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΊΠ°ΠΊ r-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.

Π‘ΠΎΠ²Π΅Ρ‚. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ постфиксныС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ нСобходимости

Π§ΠΈΡ‚Π°Ρ‚Π΅Π»ΠΈ с ΠΎΠΏΡ‹Ρ‚ΠΎΠΌ языка Π‘ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ΄ΠΈΠ²Π»Π΅Π½Ρ‹ Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π² написанных Π΄ΠΎ сих ΠΏΠΎΡ€ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ… использовался прСфиксный ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π°. ΠŸΡ€ΠΈΡ‡ΠΈΠ½Π° проста: прСфиксная вСрсия позволяСт ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ Π½Π΅Π½ΡƒΠΆΠ½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹. Она ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚. ΠŸΠΎΡΡ‚Ρ„ΠΈΠΊΡΠ½Ρ‹ΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ Π΄ΠΎΠ»ΠΆΠ΅Π½ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ исходноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π½Π΅ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠ°ΠΊ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚. Но Ссли Π² исходном Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΈ Π½Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ потрСбности, Ρ‚ΠΎ Π½Π΅Ρ‚ нСобходимости ΠΈ Π² Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… дСйствиях, осущСствляСмых постфиксным ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ.

Для ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠ° int ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ компилятор способСн ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ ΠΈ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ количСство Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… дСйствий. Для Π±ΠΎΠ»Π΅Π΅ слоТных Ρ‚ΠΈΠΏΠΎΠ² ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ дСйствия ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠ±ΠΎΠΉΡ‚ΠΈΡΡŒ довольно Π΄ΠΎΡ€ΠΎΠ³ΠΎ. ΠŸΡ€ΠΈ использовании прСфиксных вСрсий ΠΎΠ± эффСктивности ΠΌΠΎΠΆΠ½ΠΎ Π½Π΅ Π²ΠΎΠ»Π½ΠΎΠ²Π°Ρ‚ΡŒΡΡ. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΈ Π²Π°ΠΆΠ½Π΅Π΅ всСго Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Ρ€Π°Π·ΠΈΡ‚ΡŒ свои намСрСния Π±ΠΎΠ»Π΅Π΅ нСпосрСдствСнно.

ОбъСдинСниС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² обращСния ΠΊ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ ΠΈ ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π° Π² ΠΎΠ΄Π½ΠΎΠΌ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ

ΠŸΠΎΡΡ‚Ρ„ΠΈΠΊΡΠ½Ρ‹Π΅ вСрсии ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² ++ ΠΈ -- ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π² случаС, ΠΊΠΎΠ³Π΄Π° Π² ΠΎΠ΄Π½ΠΎΠΌ составном Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, Π° Π·Π°Ρ‚Π΅ΠΌ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ Π΅Π³ΠΎ.