CFA LogoCFA Logo Computer
Новости Статьи Магазин Драйвера Контакты
Новости
RSS канал новостей
В конце марта компания ASRock анонсировала фирменную линейку графических ускорителей Phantom Gaming. ...
Компания Huawei продолжает заниматься расширением фирменной линейки смартфонов Y Series. Очередное ...
Компания Antec в своем очередном пресс-релизе анонсировала поставки фирменной серии блоков питания ...
Компания Thermalright отчиталась о готовности нового высокопроизводительного процессорного кулера ...
Компания Biostar сообщает в официальном пресс-релизе о готовности флагманской материнской платы ...
Самое интересное
Программаторы 25 SPI FLASH Адаптеры Optibay HDD Caddy Драйвера nVidia GeForce Драйвера AMD Radeon HD Игры на DVD Сравнение видеокарт Сравнение процессоров

АРХИВ СТАТЕЙ ЖУРНАЛА «МОЙ КОМПЬЮТЕР» ЗА 2003 ГОД

Язык, на котором говорят везде

Тихон ТАРНАВСКИЙ tarnav@bigmir.net

Продолжение, начало см. в МК №1-3, 5, 7, 9 (224-226, 228, 230, 232)

Здравствуйте всем, кто все еще хочет научиться программировать на Си. Мы уже поговорили о многих составляющих языка и даже написали маленькую программку. Но пока мы умеем в своих программах двигаться только по прямой (некоторую свободу дает условная (тернарная) операция, но свобода эта, к сожалению, весьма ограничена). А ведь так хочется, чтобы мы могли не только пройти по этой прямолинейной дороге до самого горизонта, но и попасть в любую точку на любой дороге...

Вот для этого мы сейчас начнем изучать всякие ответвления, разветвления и повторения. Конструкции, которые занимаются всякими разными ветвлениями, так и называются операторами ветвления или просто ветвлениями. А те, которые ответственны за всевозможные повторения, зовутся операторами цикла (или циклами). Начнем с ветвлений.

7. Попробуйте вот это

Первым из ветвлений рассмотрим самое употребительное среди них —если. Конструкция его такова:

Или, в расширенной форме:

Это переводится так (первый вариант): «если (по-английски —if) условное_выражение не нулевое — выполни оператор». И второй вариант: «если условное_выражение не нулевое — выполни оператор1, иначе (по-английски —else), то есть, если нулевое — выполни оператор2». Вы обратили внимание, что тут нет ключевых для многих языков понятий «правда» и «неправда»? Ведь в сях и правда, и неправда — это числовые значения. Неправда равна нулю, таким образом «ненулевое» значит «не неправда», то есть за правду оператором if (да и любым другим оператором ветвления) принимаются все значения кроме нуля.

Вообще, то, что «правда» и «ложь» воспринимаются как обычные целочисленные значения, может показаться странным, если вы раньше писали на каком-нибудь языке с «традиционной» трактовкой логики, но если привыкнуть (а привыкнуть несложно), то это дает дополнительные возможности. Простой пример: надо вам приписать к числу слева единичку, но только в том случае, если оно одноцифренное. Пишете так: x+=10*(x<10). Если икс меньше десяти (одноцифренный), то в скобках будет 1, и таким образом прибавится десять; если же икс многоцифренный — в скобках ноль, и не прибавится ничего.

Но вернемся к нашему Ифу (не замку, а оператору). В его контексте численность логики чаще всего используется для сравнений на ноль/не ноль: if(a) вместо if(a!=0) и if(!a) вместо if(a==0). Вы можете, конечно, написать и что-то вроде if(a-b) там, где надо if(a!=b), но незачем. Общепринятые же сокращения удобны для читабельности программы, особенно когда уже есть привычка к «числовой правде».

Может быть, вас смущает то, что, судя по моей записи, «при условии» может быть выполнен всего один оператор? В таком случае вспомните про составные операторы, а именно: если вам в конкретном случае нужен не один оператор, а несколько — просто запихните их все в общие фигурные скобки.

Как видите, оператор «если» не зря считается самым простым ветвлением — он и в самом деле достаточно прост. Теперь давайте перепишем нашу программку из предыдущей части с использованием этого ветвления:

Как видите, операторы «если» можно вкладывать один в другой, если нужно обработать несколько вариантов. Здесь второй оператор «если» сработает только при a<=b, таким образом последняя строка выполнится в единственном случае —a==b. Без вложенных ифов можно обойтись, если проверить все три условия по отдельности:

Вам выбирать, каким из этих вариантов пользоваться, но при намного более сложных условиях второй может оказаться на порядок больше первого не только по объему текста в исходнике, но и по размеру выходного бинарника, и по времени выполнения.

8. Куда идем мы с пятачком

Следующим упомяну оператор, который если уж и есть резон использовать, то только вместе с ифом. Это оператор перехода; только не с Суворовым через Альпы, а просто куда-нибудь в другое место той же программы (точнее, той же функции, ибо переходы из одной функции в другую запрещены). Сам по себе он, конечно, тоже работает, но совершенно бессмыслен и к тому же сильно снижает читабельность исходника. С этой точки зрения я не рекомендую вам его использовать даже внутри ветвлений, тем более что я пока не видел случая, где без него нельзя было бы обойтись (или где это «обойтись» было бы не очень красиво).

Я вас уже, наверное, достал своими рекомендациями насчет «читабельности». Но вы меня поймете, если вам хоть раз придется читать свою же программу, написанную несколько месяцев (а то и лет) назад. Многие «опытные» программисты советуют для таких случаев все свои программы щедро комментировать (чуть не каждую строчку). Но ведь недаром существует народное изречение: «Хорошему программисту комментарии не нужны — у него есть текст программы!» И действительно, хорошо, читабельно написанную программу можно прочитать без всяких комментариев (если, конечно, хорошо знать язык, на котором она написана). И надо сказать, очень многие действительно опытные программисты считают хорошим тоном писать только один комментарий в самом начале исходника, в котором объяснено, чем эта программа занимается; плюс иногда такого же плана комментарии перед большими функциями собственного исполнения — чтоб не копаться в каждой функции, если нужно понять общий принцип работы программы (или если функция присоединяется в уже скомпилированном виде); а если нужны нюансы — читай сам исходник (иногда, скорее в виде исключения, вставляют коротенькие пояснения в тех местах, где что-то сделано ну очень уж нестандартно).

А теперь, для полноты картины, я все же научу вас оператору, которым так настоятельно отсоветовал пользоваться.

Называется он goto; это переводится как «иди на...». То, что вы подумали (или могли бы подумать), тут не подразумевается, а подразумевается (вместо многоточия) метка, которая стоит после оператора goto. Такая же метка должна стоять в том месте, на которое надо перейти — в начале строки, завершенная двоеточием. Сразу после этого двоеточия можно писать операторы. Можно, но не нужно. Опять-таки, с точки зрения читабельности. Ибо для нее (читабельности) используют отступы для выделения составных операторов. Если вы напишете метку со следующим за ней оператором после такого отступа, то, наткнувшись на оператор перехода, найти эту метку беглым взглядом по исходнику будет проблематично. Посему метки принято писать с самого начала строки, без отступов. Если даже после такой, без отступа, метки, написать в той же строке оператор, то это, наоборот, будет сбивать при чтении этого участка программы. Посему рекомендую, если уж пользоваться метками, писать саму метку без отступа в одной строке, а оператор после нее, с положенным ему отступом, в следующей.

А что это я там говорил про какие-то отступы? Да очень просто: все, что не попадает внутрь чего-либо, то есть определения глобальных переменных и заголовки функций, принято писать с начала строки. Далее же, при открытии каждой фигурной скобки добавлять, скажем, по одному пробелу во все строки до соответствующей закрывающей. То есть, писать примерно вот так:

Таким образом все, что внутри одного составного оператора, пишется в одну колонку, тем правее, чем глубже уровень вложенности этого оператора.

Многие рекомендуют делать отступы не пробелами, а табуляциями, дабы проще было отличить, скажем, пятую колонку от шестой. Но на мой взгляд, это, во-первых, неудобнее, ибо тогда при достаточно глубоких вложениях большая часть исходника будет находиться намного правее монитора — придется скролить не только вверх-вниз, но и влево-вправо. А во-вторых, это и не очень-то нужно, ибо почти все текстовые редакторы показывают колонку, в которой стоит курсор: поставил его на первый значащий символ строки — увидел глубину вложения цифрой (в этом смысле с табуляцией даже хуже — приходится каждый раз в уме делить на ширину табуляции).

После такого небольшого отступления вернемся к теме главы. Не очень-то понятно, зачем оператор goto вообще нужен. Как мне кажется, это скорее рудимент старых бейсиков, где после того же ифа мог стоять только один оператор — вот и приходилось вместо составных операторов (которых в бейсиках нет) гонять программу по самой себе то туда, то сюда. Сами Керниган и Ричи (авторы первого учебника по сям, а Ричи (я уже упоминал об этом) — автор самого языка) не рекомендовали его использовать и придумали всего один пример, когда он может пригодиться — когда надо вывалиться из вложенных циклов; да и то сами предложили альтернативное решение. А я могу предложить еще один, даже проще, — но об этом поговорим тогда, когда пойдет разговор о циклах.

А сейчас, раз уж зашла речь об учебниках, дам что-то вроде небольшого списка литературы. По сути, что-то принципиально новое по сравнению с этим материалом вы в этих книгах вряд ли найдете, но на одни и те же вещи часто бывает полезно посмотреть с нескольких точек зрения, особенно если эти точки зрения чужие — тогда проще будет, основываясь на них, составить свою.

Пункт первый — библия СИльных программистов, уже упомянутая книга Брайана Кернигана (Brian Kernighan) и Дениса Ричи (Dennis Ritchie) «Язык программирования «Си»» («The «C» programming language»), написанная еще в семьдесят не то седьмом, не то восьмом году. Очень хороший ее русский перевод был издан в 82-м году в Москве, и его электронная версия до сих пор блуждает по просторам Интернета. Рекомендую всем, написано человеческим языком и не привязана к конкретному компилятору (и то и другое для таких книг — большая редкость).

Второе, что я посоветую, — это книга польского автора Яна Белецкого, к сожалению, у меня ее сейчас нет, так что не могу сообщить точное ее название. И последняя книга, которую я могу порекомендовать независимо от компилятора уже для тех, кто знает Си — в ней даются «советы профессионалу». Это «Си для профессиональных программистов» Герберта Шилдта, тоже книга более чем общеизвестная.

Все остальное, что мне попадалось, ориентировано на конкретный компилятор или среду, притом написано даже хуже, чем штатная документация. Посему к этим штатным вас и отсылаю. Конечно, в «комплекте» они чаще всего идут «по-ангельски», но в Сети точно лежат переводы. А линуксоидам я даже могу дать полезную ссылку, которая пригодится не только при программировании на сях, но и вообще для «жизни в системе»: на citforum.ru лежит хороший перевод (на великий и могучий, разумеется) большого количества манов (для непосвященных, man — это документация в Линуксе, сокращенно от «manual» — руководство), в том числе по сям. Вот адрес: http://www.citforum.ru/operating_systems/manpages/index.shtml. Сишная часть этого перевода может пригодиться и жителям других ОСей, ибо, как я уже говорил, основная часть языка независима от системы. Опять же, для непосвященных рассказываю, как пользоваться: для справки по какой-то конкретной функции вам нужна страница с именем типа имя_функции.3; 3 — номер раздела манов, в котором лежат все сишные доки.

Все книги, которые я перечислил выше, наверняка есть в электронных версиях где-то в Инете; Гугль его знает, где.

Рекомендуем ещё прочитать:






Данную страницу никто не комментировал. Вы можете стать первым.

Ваше имя:
Ваша почта:

RSS
Комментарий:
Введите символы или вычислите пример: *
captcha
Обновить





Хостинг на серверах в Украине, США и Германии. © sector.biz.ua 2006-2015 design by Vadim Popov