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

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

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

char &get_val(string &str, string::size_type ix) {

 return str[ix]; // get_val ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π΄Π°Π½Π½Ρ‹ΠΉ индСкс допустим

}

int main() {

 string s("a value");

 cout << s << endl;   // ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅

 get_val(s, 0) = 'A'; // измСняСт s[0] Π½Π° A

 cout << s << endl;   // ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ A

 return 0;

}

ΠœΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ нСсколько странно Π²ΠΈΠ΄Π΅Ρ‚ΡŒ Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ слСва ΠΎΡ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° присвоСния. Однако Π² этом Π½Π΅Ρ‚ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ. Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ β€” ссылка, поэтому Π²Ρ‹Π·ΠΎΠ² β€” это l-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π° любоС l-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π»Π΅Π²Ρ‹ΠΌ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ΠΎΠΌ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° присвоСния.

Если Ρ‚ΠΈΠΏ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния являСтся ссылкой Π½Π° константу, Ρ‚ΠΎ (ΠΊΠ°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ) присвоСниС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρƒ Π²Ρ‹Π·ΠΎΠ²Π° Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ:

shorterString("hi", "bye") = "X"; // ошибка: Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅

                                  // являСтся константой

Бписочная инициализация Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния

По Π½ΠΎΠ²ΠΎΠΌΡƒ стандарту Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½Π½Ρ‹ΠΉ скобками список Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ. Подобно Π»ΡŽΠ±ΠΎΠΌΡƒ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ ΡΠ»ΡƒΡ‡Π°ΡŽ возвращСния значСния, список ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π΅Π³ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ значСния. Если список пуст, Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ инициализируСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ (см. Ρ€Π°Π·Π΄Π΅Π» 3.3.1). Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ зависит ΠΎΡ‚ Ρ‚ΠΈΠΏΠ° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° вСрнСмся ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ error_msg ΠΈΠ· Ρ€Π°Π·Π΄Π΅Π» 6.2.6. Π­Ρ‚Π° функция ΠΏΠΎΠ»ΡƒΡ‡Π°Π»Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ΅ количСство строковых Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΈ Π²Ρ‹Π²ΠΎΠ΄ΠΈΠ»ΠΎ сообщСниС ΠΎΠ± ошибкС, составлСнноС ΠΈΠ· ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹Ρ… строк. Π’Π΅ΠΏΠ΅Ρ€ΡŒ вмСсто Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ error_msg() ΠΌΡ‹ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΠΌ Π²Π΅ΠΊΡ‚ΠΎΡ€, содСрТащий строки сообщСний ΠΎΠ± ошибкС:

vector<string> process() {

 // ...

 // expected ΠΈ actual - строки

 if (expected.empty())

  return {}; // Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ пустой Π²Π΅ΠΊΡ‚ΠΎΡ€

 else if (expected == actual)

  return {"functionX", "okay"}; // Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π²Π΅ΠΊΡ‚ΠΎΡ€

                                // ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ списком

 else

  return {"functionX", expected, actual};

}

Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΌ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π΅ return возвращаСтся пустой список. Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Π½Ρ‹ΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹ΠΉ Π²Π΅ΠΊΡ‚ΠΎΡ€ Π±ΡƒΠ΄Π΅Ρ‚ пуст. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС возвращаСтся Π²Π΅ΠΊΡ‚ΠΎΡ€, ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ двумя ΠΈΠ»ΠΈ трСмя элСмСнтами, Π² зависимости ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, Ρ€Π°Π²Π½Ρ‹ Π»ΠΈ expected ΠΈ actual.

Π£ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰Π΅ΠΉ встроСнный Ρ‚ΠΈΠΏ, Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹ΠΉ Π² скобки список ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ хотя Π±Ρ‹ ΠΎΠ΄Π½ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΈ это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒ ΡΡƒΠΆΠ°ΡŽΡ‰Π΅Π³ΠΎ прСобразования (см. Ρ€Π°Π·Π΄Π΅Π» 2.2.1). Если функция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ‚ΠΈΠΏ класса, Ρ‚ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹ опрСдСляСт сам класс (см. Ρ€Π°Π·Π΄Π΅Π» 3.3.1).

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ значСния ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ main()

Π•ΡΡ‚ΡŒ ΠΎΠ΄Π½ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· ΠΏΡ€Π°Π²ΠΈΠ»Π°, согласно ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ функция с Ρ‚ΠΈΠΏΠΎΠΌ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния, ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎΠ³ΠΎ ΠΎΡ‚ void, обязана Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅: функция main() ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ Π±Π΅Π· возвращСния значСния. Если процСсс выполнСния достигаСт ΠΊΠΎΠ½Ρ†Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ main() ΠΈ Π½Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ значСния для возвращСния, компилятор нСявно добавляСт Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ значСния 0.

Как ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΎΡΡŒ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 1.1, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ main(), рассматриваСтся ΠΊΠ°ΠΊ ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€ состояния. Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ Π½ΡƒΠ»Π΅Π²ΠΎΠ³ΠΎ значСния ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ успСх; Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ β€” Π½Π΅ΡƒΠ΄Π°Ρ‡Ρƒ. Π£ значСния, ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎΠ³ΠΎ ΠΎΡ‚ нуля, Π΅ΡΡ‚ΡŒ машинно-зависимоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π΅Π³ΠΎ нСзависимым ΠΎΡ‚ ΠΌΠ°ΡˆΠΈΠ½Ρ‹, Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ cstdlib опрСдСляСт Π΄Π²Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ прСпроцСссора (см. Ρ€Π°Π·Π΄Π΅Π» 2.3.2), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ†ΠΈΠΈ успСха ΠΈΠ»ΠΈ ΠΎΡ‚ΠΊΠ°Π·Π°:

int main() {

 if (some failure)

  return EXIT_FAILURE; // ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ Π² cstdlib

 else

  return EXIT_SUCCESS; // ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ Π² cstdlib

}

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ это ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ прСпроцСссора, ΠΈΠΌ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΡ€Π΅Π΄ΡˆΠ΅ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Ρ‡Π°ΡΡ‚ΡŒ std:: ΠΈ ΠΈΡ… нСльзя ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½ΠΈΡΡ… using.

РСкурсия

Ѐункция, которая Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ сСбя прямо ΠΈΠ»ΠΈ косвСнно, являСтся рСкурсивной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ (recursive function). Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ вычислСния Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ°Π»Π° Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π΅ΠΊΡƒΡ€ΡΠΈΡŽ:

// Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ val!, Ρ‚.Π΅. 1 * 2 * 3 ... * val

int factorial(int val) {

 if (val > 1)

  return factorial(val-1) * val;

 return 1;

}

Π’ этой Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ осущСствляСтся рСкурсивный Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ factorial(), Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ°Π» числа, начиная со значСния, ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½ΠΎΠ³ΠΎ val, ΠΈ Π΄Π°Π»Π΅Π΅ Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ порядкС. Когда Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ val достигнСт 1, рСкурсия останавливаСтся ΠΈ возвращаСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 1.

Π’ рСкурсивной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ всСгда Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ условиС Π²Ρ‹Ρ…ΠΎΠ΄Π° ΠΈΠ»ΠΈ останова (stopping condition); Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС рСкурсия станСт бСсконСчной, Ρ‚.Π΅. функция ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ сСбя Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° стСк ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ исчСрпан. Иногда эта ошибка называСтся бСсконСчной рСкурсиСй (infinite recursion). Π’ случаС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ factorial() условиСм Π²Ρ‹Ρ…ΠΎΠ΄Π° являСтся равСнство значСния ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° val Π΅Π΄ΠΈΠ½ΠΈΡ†Π΅.

НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° трассировка выполнСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ factorial() ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ Π΅ΠΉ значСния 5.


Врассировка Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ factorial(5)

Π’Ρ‹Π·ΠΎΠ² Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ factorial(5) factorial(4) * 5 120 factorial(4) factorial(3) * 4 24 factorial(3) factorial(2) * 3 6 factorial(2) factorial(1) * 2 2 factorial(1) 1 1

Ѐункция main() Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ сама сСбя.

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

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 6.30. ΠžΡ‚ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠΉΡ‚Π΅ Π²Π΅Ρ€ΡΠΈΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ str_subrange(), прСдставлСнной Π² Π½Π°Ρ‡Π°Π»Π΅ Ρ€Π°Π·Π΄Π΅Π»Π°, ΠΈ посмотритС, Ρ‡Ρ‚ΠΎ ваш компилятор Π΄Π΅Π»Π°Π΅Ρ‚ с ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌΠΈ сообщСниями ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ….

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 6.31. Когда допустимо Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ссылки? Когда ссылки Π½Π° константу?

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 6.32. Π£ΠΊΠ°ΠΆΠΈΡ‚Π΅, ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Π° Π»ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ функция. Если Π΄Π°, Ρ‚ΠΎ ΠΎΠ±ΡŠΡΡΠ½ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° Π΄Π΅Π»Π°Π΅Ρ‚; Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС ΠΈΡΠΏΡ€Π°Π²ΡŒΡ‚Π΅ ошибки, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΎΠ±ΡŠΡΡΠ½ΠΈΡ‚Π΅ всС.

int &get(int *arry, int index) { return arry[index]; }

int main() {

 int ia[10];

 for (int i = 0; i != 10; ++i)

  get(ia, i) = i;

}

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 6.33. ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ Ρ€Π΅ΠΊΡƒΡ€ΡΠΈΠ²Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, Π²Ρ‹Π²ΠΎΠ΄ΡΡ‰ΡƒΡŽ содСрТимоС Π²Π΅ΠΊΡ‚ΠΎΡ€Π°.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 6.34. Π§Ρ‚ΠΎ случится, Ссли условиС остановки Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ factorial() Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚Π°ΠΊΠΈΠΌ:

if (val != 0)

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 6.35. ΠŸΠΎΡ‡Π΅ΠΌΡƒ Π² Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ factorial() ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π»ΠΈ val-1, Π° Π½Π΅ val--?

6.3.3. Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ указатСля Π½Π° массив

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ массив нСльзя, функция Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π΅Π³ΠΎ. Но функция ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ ΠΈΠ»ΠΈ ссылку Π½Π° массив (см. Ρ€Π°Π·Π΄Π΅Π» 3.5.1). К соТалСнию, синтаксис, ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ для опрСдСлСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ ΠΈΠ»ΠΈ ссылки Π½Π° массив, довольно слоТСн. К ΡΡ‡Π°ΡΡ‚ΡŒΡŽ, Ρ‚Π°ΠΊΠΈΠ΅ объявлСния ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ. НапримСр, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ псСвдоним Ρ‚ΠΈΠΏΠ° (см. Ρ€Π°Π·Π΄Π΅Π» 2.5.1):

typedef int arrT[10];  // arrT синоним для Ρ‚ΠΈΠΏΠ° массива ΠΈΠ· дСсяти

                       // Ρ†Π΅Π»Ρ‹Ρ… чисСл

using arrtT = int[10]; // эквивалСнтноС объявлСниС arrT;

                       // см. Ρ€Π°Π·Π΄Π΅Π» 2.5.1

arrT* func(int i);     // func Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° массив ΠΈΠ·

                       // пяти Ρ†Π΅Π»Ρ‹Ρ… чисСл

Π³Π΄Π΅ arrT β€” это синоним для массива ΠΈΠ· дСсяти Ρ†Π΅Π»Ρ‹Ρ… чисСл. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ нСльзя Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ массив, ΠΌΡ‹ опрСдСляСм Ρ‚ΠΈΠΏ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния ΠΊΠ°ΠΊ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° этот Ρ‚ΠΈΠΏ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, функция func() ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Ρ‚ΠΈΠΏΠ° int ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° массив ΠΈΠ· дСсяти Ρ†Π΅Π»Ρ‹Ρ… чисСл.

ОбъявлСниС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰Π΅ΠΉ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° массив

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ func(), Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ псСвдоним Ρ‚ΠΈΠΏΠ°, слСдуСт Π²ΡΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π½ΠΎΡΡ‚ΡŒ массива слСдуСт Π·Π° опрСдСляСмым ΠΈΠΌΠ΅Π½Π΅ΠΌ:

int arr[10];          // arr массив ΠΈΠ· дСсяти Ρ†Π΅Π»Ρ‹Ρ… чисСл

int *p1[10];          // p1 массив ΠΈΠ· дСсяти ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ