Передача числовых аргументов командной строки



 

Как упоминалось выше, при передаче программе числовых данных в качестве аргументов командной строки эти данные принимаются в строковой форме. В программе должно быть предусмотрено их преобразование в соответствующий внутренний формат с помощью одной из стандартных библиотечных функций, поддерживаемых C++. Например, при выполнении следующей программы выводится сумма двух чисел, которые указываются в командной строке после имени программы. Для преобразования аргументов командной строки во внутреннее представление здесь используется стандартная библиотечная функция atof() . Она преобразует число из строкового формата в значение типа double.

 

 

Чтобы сложить два числа, используйте командную строку такого вида (предполагая, что эта программа имеет имя add ).

 

Преобразование числовых строк в числа

 

Стандартная библиотека C++ включает несколько функций, которые позволяют преобразовать строковое представление числа в его внутренний формат. Для этого используются такие функции, как atoi() , atol() и atof() . Они преобразуют строку в целочисленное значение (типа int ), длинное целое (типа long ) и значение с плавающей точкой (типа double ) соответственно. Использование этих функций (для их вызова необходимо включить в программу заголовочный файл <cstdlib> ) демонстрируется в следующей программе.

 

 

Результаты выполнения этой программы таковы.

 

 

Функции преобразования строк полезны не только при передаче числовых данных программе через аргументы командной строки, но и в ряде других ситуаций.

 

Инструкция return

 

До сих пор (начиная с главы 2) мы использовали инструкцию return без подробных разъяснений. Напомним, что инструкция return выполняет две важные операции. Во‑первых, она обеспечивает немедленное возвращение управления к инициатору вызова функции. Во‑вторых, ее можно использовать для передачи значения, возвращаемого функцией. Именно этим двум операциям и посвящен данный раздел.

 

Завершение функции

 

Как вы уже знаете, управление от функции передается инициатору ее вызова в двух ситуациях: либо при обнаружении закрывающейся фигурной скобки, либо при выполнении инструкции return . Инструкцию return можно использовать с некоторым заданным значением либо без него. Но если в объявлении функции указан тип возвращаемого значения (т.е. не тип void ), то функция должна возвращать значение этого типа. Только void ‑функции могут использовать инструкцию return без какого бы то ни было значения.

Для void ‑функций инструкция return главным образом используется как элемент программного управления. Например, в приведенной ниже функции выводится результат возведения числа в положительную целочисленную степень. Если же показатель степени окажется отрицательным, инструкция return обеспечит выход из функции, прежде чем будет сделана попытка вычислить такое выражение. В этом случае инструкция return действует как управляющий элемент, предотвращающий нежелательное выполнение определенной части функции.

 

 

Функция может содержать несколько инструкций return . Функция будет завершена при выполнении хотя бы одного из них. Например, следующий фрагмент кода совершенно правомерен.

 

 

Однако следует иметь в виду, что слишком большое количество инструкций return может ухудшить ясность алгоритма и ввести в заблуждение тех, кто будет в нем разбираться. Несколько инструкций return стоит использовать только в том случае, если они способствуют ясности функции.

 

Возврат значений

 

Каждая функция, кроме типа void , возвращает какое‑нибудь значение. Это значение явно задается с помощью инструкции return . Другими словами, любую не void ‑функцию можно использовать в качестве операнда в выражении. Следовательно, каждое из следующих выражений допустимо в C++.

 

 

Несмотря на то что все не void ‑функции возвращают значения, они необязательно должны быть использованы в программе. Самый распространенный вопрос относительно значений, возвращаемых функциями, звучит так: "Поскольку функция возвращает некоторое значение, то разве я не должен (должна) присвоить это значение какой‑нибудь переменной?". Ответ: нет, это необязательно. Если значение, возвращаемое функцией, не участвует в присваивании, оно попросту отбрасывается (теряется).

Рассмотрим следующую программу, в которой используется стандартная библиотечная функция abs() .

 

 

Функция abs() возвращает абсолютное значение своего целочисленного аргумента. Она использует заголовок <cstdlib> . В строке 1 значение, возвращаемое функцией abs() , присваивается переменной i . В строке 2 значение, возвращаемое функцией abs() , ничему не присваивается, но используется инструкцией cout . Наконец, в строке 3 значение, возвращаемое функцией abs() , теряется, поскольку не присваивается никакой другой переменной и не используется как часть выражения.

Если функция, тип которой отличен от типа void , завершается в результате обнаружения закрывающейся фигурной скобки, то значение, которое она возвращает, не определено (т.е. неизвестно). Из‑за особенностей формального синтаксиса C++ не void‑функция не обязана выполнять инструкцию return . Это может произойти в том случае, если конец функции будет достигнут до обнаружения инструкции return . Но, поскольку функция объявлена как возвращающая значение, значение будет таки возвращено, даже если это просто "мусор". В общем случае любая создаваемая вами не void ‑функция должна возвращать значение посредством явно выполняемой инструкции return .

Выше упоминалось, что void ‑функция может иметь несколько инструкций return . То же самое относится и к функциям, которые возвращают значения. Например, представленная в следующей программе функция find_substr() использует две инструкции return , которые позволяют упростить алгоритм ее работы. Эта функция выполняет поиск заданной подстроки в заданной строке. Она возвращает индекс первого обнаруженного вхождения заданной подстроки или значение ‑1 , если заданная подстрока не была найдена. Например, если в строке "Я люблю C++ " необходимо отыскать подстроку "люблю" , то функция find_substr() возвратит число 2 (которое представляет собой индекс символа "л" в строке "Я люблю C++ " ).

 

 

Результаты выполнения этой программы таковы.

 

 

Поскольку искомая подстрока существует в заданной строке, выполняется первая инструкция return . В качестве упражнения измените программу так, чтобы ею выполнялся поиск подстроки, которая не является частью заданной строки. В этом случае функция find_substr() должна возвратить значение ‑1 (благодаря второй инструкции return ).

Функцию можно объявить так, чтобы она возвращала значение любого типа данных, действительного для C++ (за исключением массива: функция не может возвратить массив). Способ объявления типа значения, возвращаемого функцией, аналогичен тому, который используется для объявления переменных: имени функции должен предшествовать спецификатор типа. Спецификатор типа сообщает компилятору, значение какого типа данных должна возвратить функция. Указываемый в объявлении функции тип должен быть совместимым с типом данных, используемым в инструкции return. В противном случае компилятор отреагирует сообщением об ошибке.

 

Функции, которые не возвращают значений (void‑функции)

 

Как вы заметили, функции, которые не возвращают значений, объявляются с указанием типа void . Это ключевое слово не допускает их использования в выражениях и защищает от неверного применения. В следующем примере функция print_vertical() выводит аргумент командной строки в вертикальном направлении (вниз) по левому краю экрана. Поскольку эта функция не возвращает никакого значения, в ее объявлении использовано ключевое слово void.

 

 

Поскольку print_vertical() объявлена как void ‑функция, ее нельзя использовать в выражении. Например, следующая инструкция неверна и поэтому не скомпилируется.

 

 

Важно! В первых версиях языка С не был предусмотрен тип void. Таким образом, в старых С‑программах функции, не возвращающие значений, по умолчанию имели тип int. Если вам придется встретиться с такими функциями при переводе старых С‑программ "на рельсы" C++, просто объявите их с использованием ключевого слова void, сделав их void‑функциями.

 


Дата добавления: 2018-09-22; просмотров: 252; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!