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

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

Автор ΠœΡŽΡ€Ρ€Π΅ΠΉ Π₯ΠΈΠ»Π»

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

2.4.4 Π‘Ρ‚Ρ€ΠΎΠΊΠΈ

Бтроковая константа – это ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ символов, Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Π°Ρ Π² Π΄Π²ΠΎΠΉΠ½Ρ‹Π΅ ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠΈ "

«это строка»

КаТдая строковая константа содСрТит Π½Π° ΠΎΠ΄ΠΈΠ½ символ большС, Ρ‡Π΅ΠΌ каТСтся; всС ΠΎΠ½ΠΈ Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°ΡŽΡ‚ΡΡ пустым символом '\0' со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ 0. НапримСр:

sizeof(Β«asdfΒ»)==5;

Π‘Ρ‚Ρ€ΠΎΠΊΠ° ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ Β«Π²Π΅ΠΊΡ‚ΠΎΡ€ ΠΈΠ· ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ числа символов», поэтому Β«asdfΒ» ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ char[5]. ΠŸΡƒΡΡ‚Π°Ρ строка записываСтся "" (ΠΈ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ char[1]). Π—Π°ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ строки s strlen(s)==sizeof(s)-1, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ strlen() Π½Π΅ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Π΅Ρ‚ Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰ΠΈΠΉ 0.

БоглашСниС ΠΎ прСдставлСнии нСграфичСских символов с ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΉ косой ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈ Π²Π½ΡƒΡ‚Ρ€ΠΈ строки. Π­Ρ‚ΠΎ Π΄Π°Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ Π΄Π²ΠΎΠΉΠ½Ρ‹Π΅ ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠΈ ΠΈ escape-символ. Π‘Π°ΠΌΡ‹ΠΌ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ символом этого Ρ€ΠΎΠ΄Π° являСтся, бСзусловно, символ Π½ΠΎΠ²ΠΎΠΉ строки '\n'. НапримСр:

cout Β«β€ž Β«Π³ΡƒΠ΄ΠΎΠΊ Π² ΠΊΠΎΠ½Ρ†Π΅ сообщСния\007\nβ€œ

Π³Π΄Π΅ 7 – Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ASKII символа bel (Π·Π²ΠΎΠ½ΠΎΠΊ).

Π’ строкС Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠΌΠ΅Ρ‚ΡŒ Β«Π½Π°ΡΡ‚ΠΎΡΡ‰ΡƒΡŽΒ» Π½ΠΎΠ²ΡƒΡŽ строку:

«это Π½Π΅ строка, Π° синтаксичСская ошибка»

Однако Π² строкС ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡ‚ΠΎΡΡ‚ΡŒ обратная косая, сразу послС ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΈΠ΄Π΅Ρ‚ новая строка; ΠΈ Ρ‚ΠΎ, ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ. НапримСр:

cout Β«β€ž «здСсь всС \ okβ€œ

Π½Π°ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅Ρ‚

здСсь всС ok

Новая строка, ΠΏΠ΅Ρ€Π΅Π΄ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΈΠ΄Π΅Ρ‚ escape (обратная косая), Π½Π΅ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ появлСнию Π² строкС Π½ΠΎΠ²ΠΎΠΉ строки, это просто Π΄ΠΎΠ³ΠΎΠ²ΠΎΡ€Π΅Π½Π½ΠΎΡΡ‚ΡŒ ΠΎ записи.

Π’ строкС ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠΌΠ΅Ρ‚ΡŒ пустой символ, Π½ΠΎ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ символы послС Π½Π΅Π³ΠΎ. НапримСр, строка Β«asdf\000hjklΒ» Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒΡΡ стандартными функциями, Π²Ρ€ΠΎΠ΄Π΅ strcpy() ΠΈ strlen(), ΠΊΠ°ΠΊ Β«asdfΒ».

Вставляя Ρ‡ΠΈΡΠ»Π΅Π½Π½ΡƒΡŽ константу Π² строку с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π²ΠΎΡΡŒΠΌΠ΅Ρ€ΠΈΡ‡Π½ΠΎΠΉ ΠΈΠ»ΠΈ ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½ΠΎΠΉ записи Π±Π»Π°Π³ΠΎΡ€Π°Π·ΡƒΠΌΠ½ΠΎ всСгда ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ число ΠΈΠ· Ρ‚Ρ€Π΅Ρ… Ρ†ΠΈΡ„Ρ€. Π§ΠΈΡ‚Π°Ρ‚ΡŒ запись достаточно Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ ΠΈ Π±Π΅Π· нСобходимости Π±Π΅ΡΠΏΠΎΠΊΠΎΠΈΡ‚ΡŒΡΡ ΠΎ Ρ‚ΠΎΠΌ, являСтся Π»ΠΈ символ послС константы Ρ†ΠΈΡ„Ρ€ΠΎΠΉ ΠΈΠ»ΠΈ Π½Π΅Ρ‚. Π Π°Π·Π±Π΅Ρ€ΠΈΡ‚Π΅ эти ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹:

char v1[] = Β«a\x0fah\0129Β»; // 'a' '\xfa' 'h' '\12' '9' char v2[] = Β«a\xfah\129Β»; // 'a' '\xfa' 'h' '\12' '9' char v3[] = Β«a\xfad\127Β»; // 'a' '\xfad' '\127'

Π˜ΠΌΠ΅ΠΉΡ‚Π΅ Π² Π²ΠΈΠ΄Ρƒ, Ρ‡Ρ‚ΠΎ Π΄Π²ΡƒΡ…Π·Π½Π°Ρ‡Π½ΠΎΠΉ ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½ΠΎΠΉ записи Π½Π° ΠΌΠ°ΡˆΠΈΠ½Π°Ρ… с 9-Π±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΌ Π±Π°ΠΉΡ‚ΠΎΠΌ Π±ΡƒΠ΄Π΅Ρ‚ нСдостаточно.

2.4.5 Ноль

Ноль ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Π»ΡΡ‚ΡŒ ΠΊΠ°ΠΊ константу любого Ρ†Π΅Π»ΠΎΠ³ΠΎ, ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅Π³ΠΎ ΠΈΠ»ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°. Никакой ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π½Π΅ размСщаСтся ΠΏΠΎ адрСсу 0. Π’ΠΈΠΏ нуля опрСдСляСтся контСкстом. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ (Π½ΠΎ Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ) ΠΎΠ½ прСдставляСтся Π½Π°Π±ΠΎΡ€ΠΎΠΌ Π±ΠΈΡ‚ΠΎΠ² всС-Π½ΡƒΠ»ΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ Π΄Π»ΠΈΠ½Ρ‹.

2.4.6 Const

ΠšΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово const ΠΌΠΎΠΆΠ΅Ρ‚ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒΡΡ ΠΊ описанию ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ этот ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ константой, Π° Π½Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ. НапримСр:

const int model = 145; const int v[] = (* 1, 2, 3, 4 *);

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ константС Π½ΠΈΡ‡Π΅Π³ΠΎ нСльзя ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ, ΠΎΠ½Π° Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π°. ОписаниС Ρ‡Π΅Π³ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ ΠΊΠ°ΠΊ const Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ Π΅Π³ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π΅ измСнится Π² области видимости:


model = 145; // ошибка model++; // ошибка

Π—Π°ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ const измСняСт Ρ‚ΠΈΠΏ, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ способ использования ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, вмСсто Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ способ размСщСния константы. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π²ΠΏΠΎΠ»Π½Π΅ Ρ€Π°Π·ΡƒΠΌΠ½ΠΎ, Π° ΠΈΠ½ΠΎΠ³Π΄Π° ΠΈ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ, ΠΎΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΊΠ°ΠΊ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰ΡƒΡŽ const:

const char* peek(int i) (* return private[i]; *)

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

Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, компилятор ΠΌΠΎΠΆΠ΅Ρ‚ нСсколькими путями Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ являСтся константой (ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π² зависимости ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, насколько ΠΎΠ½ сообразитСлСн). Π‘Π°ΠΌΠΎΠ΅ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎΠ΅ – это Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ для константы Π½Π΅ трСбуСтся Π²Ρ‹Π΄Π΅Π»ΡΡ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ компилятор Π·Π½Π°Π΅Ρ‚ Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ константы часто (Π½ΠΎ Π½Π΅ всСгда) являСтся константным Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ вычислСн Π½Π° стадии компиляции. Однако для Π²Π΅ΠΊΡ‚ΠΎΡ€Π° констант ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ приходится Π²Ρ‹Π΄Π΅Π»ΡΡ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ компилятор Π² ΠΎΠ±Ρ‰Π΅ΠΌ случаС Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ, Π½Π° ΠΊΠ°ΠΊΠΈΠ΅ элСмСнты Π²Π΅ΠΊΡ‚ΠΎΡ€Π° сдСланы ссылки Π² выраТСниях. Однако Π½Π° ΠΌΠ½ΠΎΠ³ΠΈΡ… ΠΌΠ°ΡˆΠΈΠ½Π°Ρ… Π΄Π°ΠΆΠ΅ Π² этом случаС ΠΌΠΎΠΆΠ΅Ρ‚ Π΄ΠΎΡΡ‚ΠΈΠ³Π°Ρ‚ΡŒΡΡ ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΠ΅ эффСктивности ΠΏΡƒΡ‚Π΅ΠΌ размСщСния Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠ² констант Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ, Π΄ΠΎΡΡ‚ΡƒΠΏΠ½ΡƒΡŽ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для чтСния.

ИспользованиС указатСля Π²ΠΎΠ²Π»Π΅ΠΊΠ°Π΅Ρ‚ Π΄Π²Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°: сам ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ ΠΈ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. Π‘Π½Π°Π±ΠΆΠ΅Π½ΠΈΠ΅ описания указатСля «прСфиксом» const Π΄Π΅Π»Π°Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Π½ΠΎ Π½Π΅ сам ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ, константой. НапримСр:

const char* pc = Β«asdfΒ»; // ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° константу pc[3] = 'a'; // ошибка pc = Β«ghjkΒ»; // ok

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ сам const ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ, Π° Π½Π΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΊΠ°ΠΊ константный, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ опСрация const*. НапримСр:

char *const cp = Β«asdfΒ»; // константный ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ cp[3] = 'a'; // ok cp = Β«ghjkΒ»; // ошибка

Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ константами ΠΎΠ±Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΠΈΡ… ΠΎΠ±Π° Π½ΡƒΠΆΠ½ΠΎ ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ const. НапримСр:

const char *const cpc = Β«asdfΒ»; // const ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° const cpc[3] = 'a'; // ошибка cpc = Β«ghjkΒ»; // ошибка

ΠžΠ±ΡŠΠ΅ΠΊΡ‚, ΡΠ²Π»ΡΡŽΡ‰ΠΈΠΉΡΡ константой ΠΏΡ€ΠΈ доступС ΠΊ Π½Π΅ΠΌΡƒ Ρ‡Π΅Ρ€Π΅Π· ΠΎΠ΄ΠΈΠ½ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ, ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, ΠΊΠΎΠ³Π΄Π° доступ осущСствляСтся Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ путями. Π­Ρ‚ΠΎ Π² частности ΠΏΠΎΠ»Π΅Π·Π½ΠΎ для ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. ΠŸΠΎΡΡ€Π΅Π΄ΡΡ‚Π²ΠΎΠΌ описания ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° указатСля ΠΊΠ°ΠΊ const Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ запрСщаСтся ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠ½ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚. НапримСр:

char* strcpy(char* p, const char* q); // Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ q

Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŽ Π½Π° константу ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Ρ‚ΡŒ адрСс ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½ΠΎΠΉ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ Π²Ρ€Π΅Π΄Π° ΠΎΡ‚ этого Π±Ρ‹Ρ‚ΡŒ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚. Однако нСльзя ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ адрСс константы ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŽ, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ Π±Ρ‹Π»ΠΎ Π½Π°Π»ΠΎΠΆΠ΅Π½ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ это ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ»ΠΎ Π±Ρ‹ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. НапримСр:

int a = 1; const c = 2; const* p1 = amp;c; // ok const* p2 = amp;a; // ok int* p3 = amp;c; // ошибка *p3 = 7; // мСняСт Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ c

Как ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ, Ссли Ρ‚ΠΈΠΏ Π² описании ΠΎΠΏΡƒΡ‰Π΅Π½, Ρ‚ΠΎ ΠΎΠ½ прСдполагаСтся int.

2.4.7 ΠŸΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»Π΅Π½ΠΈΡ

Π•ΡΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ опрСдСлСния Ρ†Π΅Π»Ρ‹Ρ… констант, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠ½ΠΎΠ³Π΄Π° Π±ΠΎΠ»Π΅Π΅ ΡƒΠ΄ΠΎΠ±Π΅Π½, Ρ‡Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ const. НапримСр:

enum (* ASM, AUTO, BREAK *);

пСрСчислСниС опрСдСляСт Ρ‚Ρ€ΠΈ Ρ†Π΅Π»Ρ‹Ρ… константы, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Ρ… пСрСчислитСлями, ΠΈ присваиваСт ΠΈΠΌ значСния. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ значСния пСрСчислитСлСй ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΏΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°ΡŽΡ‚ΡΡ начиная с 0 Π² порядкС возрастания, это эквивалСнтно записи:

const ASM = 0; const AUTO = 1; const BREAK = 2;

ΠŸΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ. НапримСр:

enum keyword (* ASM, AUTO, BREAK *);

Имя пСрСчислСния становится синонимом int, Π° Π½Π΅ Π½ΠΎΠ²Ρ‹ΠΌ Ρ‚ΠΈΠΏΠΎΠΌ. ОписаниС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ keyword, Π° Π½Π΅ просто int, ΠΌΠΎΠΆΠ΅Ρ‚ Π΄Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ программисту, Ρ‚Π°ΠΊ ΠΈ компилятору подсказку ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ использованиС ΠΏΡ€Π΅Π΄Π½Π°ΠΌΠ΅Ρ€Π΅Π½Π½ΠΎΠ΅. НапримСр:

keyword key;

switch (key) (* case ASM: // Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ break; case BREAK: // Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ break; *)

ΠΏΠΎΠ±ΡƒΠΆΠ΄Π°Π΅Ρ‚ компилятор Π²Ρ‹Π΄Π°Ρ‚ΡŒ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄Π²Π° значСния keyword ΠΈΠ· Ρ‚Ρ€Π΅Ρ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ.

МоТно Ρ‚Π°ΠΊΠΆΠ΅ Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ значСния пСрСчислитСлСй явно. НапримСр:

enum int16 (* sign=0100000, // Π·Π½Π°ΠΊ most_significant=040000, // самый Π·Π½Π°Ρ‡ΠΈΠΌΡ‹ΠΉ least_significant=1 // Π½Π°ΠΈΠΌΠ΅Π½Π΅Π΅ Π·Π½Π°Ρ‡ΠΈΠΌΡ‹ΠΉ *);

Π’Π°ΠΊΠΈΠ΅ значСния Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ, Π²ΠΎΠ·Ρ€Π°ΡΡ‚Π°ΡŽΡ‰ΠΈΠΌΠΈ ΠΈΠ»ΠΈ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ.

2.5 Экономия ΠŸΡ€ΠΎΡΡ‚Ρ€Π°Π½ΡΡ‚Π²Π°

Π’ Ρ…ΠΎΠ΄Π΅ программирования Π½Π΅Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΎΠΊ Π½Π΅ΠΈΠ·Π±Π΅ΠΆΠ½ΠΎ наступаСт врСмя, ΠΊΠΎΠ³Π΄Π° хочСтся ΠΈΠΌΠ΅Ρ‚ΡŒ большС пространства памяти, Ρ‡Π΅ΠΌ имССтся ΠΈΠ»ΠΈ ΠΎΡ‚ΠΏΡƒΡ‰Π΅Π½ΠΎ. Π•ΡΡ‚ΡŒ Π΄Π²Π° способа Π²Ρ‹ΠΆΠ°Ρ‚ΡŒ побольшС пространства ΠΈΠ· Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ доступно:

1. ΠŸΠΎΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ Π² Π±Π°ΠΉΡ‚ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ нСбольшого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΈ

2. ИспользованиС ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ пространства для хранСния Ρ€Π°Π·Π½Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π² Ρ€Π°Π·Π½ΠΎΠ΅ врСмя.

ΠŸΠ΅Ρ€Π²ΠΎΠ³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΡΡ‚ΠΈΡ‡ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ использования ΠΏΠΎΠ»Π΅ΠΉ, Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ – Ρ‡Π΅Ρ€Π΅Π· использованиС объСдинСний. Π­Ρ‚ΠΈ конструкции ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Ρ€Π°Π·Π΄Π΅Π»Π°Ρ…. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ΅ ΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ состоит чисто Π² ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΈ ΠΎΠ½ΠΈ Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв нСпСрСносимы, программисту слСдуСт Π΄Π²Π°ΠΆΠ΄Ρ‹ ΠΏΠΎΠ΄ΡƒΠΌΠ°Ρ‚ΡŒ, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ…. Часто Π»ΡƒΡ‡ΡˆΠ΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ способ управлСния Π΄Π°Π½Π½Ρ‹ΠΌΠΈ; Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, большС ΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒΡΡ Π½Π° динамичСски Π²Ρ‹Π΄Π΅Π»ΡΠ΅ΠΌΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ (#3.2.6) ΠΈ мСньшС Π½Π° Π·Π°Ρ€Π°Π½Π΅Π΅ Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΡƒΡŽ ΡΡ‚Π°Ρ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ.

2.5.1 Поля

ИспользованиС char для прСдставлСния Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½ΠΎΠΉ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚Π΅Π»Ρ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΎ/Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΎ, ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ экстравагантным, Π½ΠΎ char являСтся наимСньшим ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π² Π‘++ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π΄Π΅Π»ΡΡ‚ΡŒΡΡ нСзависимо. МоТно, ΠΎΠ΄Π½Π°ΠΊΠΎ, ΡΠ³Ρ€ΡƒΠΏΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ нСсколько Ρ‚Π°ΠΊΠΈΡ… ΠΊΡ€ΠΎΡˆΠ΅Ρ‡Π½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… вмСстС Π² Π²ΠΈΠ΄Π΅ ΠΏΠΎΠ»Π΅ΠΉ struct. Π§Π»Π΅Π½ опрСдСляСтся ΠΊΠ°ΠΊ ΠΏΠΎΠ»Π΅ ΠΏΡƒΡ‚Π΅ΠΌ указания послС Π΅Π³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ числа Π±ΠΈΡ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ½ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚. Допустимы Π½Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Π΅ поля; ΠΎΠ½ΠΈ Π½Π΅ Π²Π»ΠΈΡΡŽΡ‚ Π½Π° смысл ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΏΠΎΠ»Π΅ΠΉ, Π½ΠΎ Π½Π΅ΠΊΠΈΠΌ машинно-зависимым ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΌΠΎΠ³ΡƒΡ‚ ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅:

struct sreg (* unsigned enable : 1; unsigned page : 3; unsigned : 1; // Π½Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ΅ unsigned mode : 2; unsigned : 4: // Π½Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ΅ unsigned access : 1; unsigned length : 1; unsigned non_resident : 1; *)

ΠŸΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ рСгистра 0 состояния DEC PDP11/45 (Π² ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ, Ρ‡Ρ‚ΠΎ поля Π² словС Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°ΡŽΡ‚ΡΡ слСва Π½Π°ΠΏΡ€Π°Π²ΠΎ). Π­Ρ‚ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ Π΄Ρ€ΡƒΠ³ΠΎΠ΅ основноС ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ»Π΅ΠΉ: ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Ρ‚ΡŒ части внСшнС прСдписанного размСщСния. ПолС Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Ρ†Π΅Π»ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΊΠ°ΠΊ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ†Π΅Π»Ρ‹Π΅, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π²Π·ΡΡ‚ΡŒ адрСс поля. Π’ ядрС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы ΠΈΠ»ΠΈ Π² ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ΅ Ρ‚ΠΈΠΏ sreg ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ:

sreg* sr0 = (sreg*)0777572; //... if (sr-Β»access) (* // Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΠ΅ доступа // чистит массив sr-Β»access = 0; *)