- •Использование аргументов командной строки
- •Доступ к argv и argc
- •Выполнение цикла, пока argv не содержит null
- •Трактовка argv как указателя
- •Использование аргументов командной строки
- •Доступ к переменным среды операционной системы
- •Использование констант и макрокоманд
- •Использование именованных констант
- •Использование именованных констант для упрощения изменения кода
- •Замена выражений макрокомандами
- •Чем макрокоманды отличаются от функций
Использование именованных констант для упрощения изменения кода
Кроме того, что именованные константы делают программу легче для восприятия, они еще и облегчают модификацию программ. Например, следующий фрагмент кода несколько раз ссылается на число 50 (количество студентов в классе):
#include <iostream.h>
void main(void)
{ int test_score8[50]; char grades[50]; int student; for (student = 0; student < 50; student++) get_test_score(student); for (student =0; student < 50; student++) calculate_grade(student); for (student =0; student < 50; student++) print_grade(student) ; }
Предположим, например, что количество студентов в классе увеличилось до 55. В этом случае потребуется отредактировать предыдущую программу, чтобы заменить каждый экземпляр значения 50 значением 55. В следующей программе применен другой подход, она использует именованную константу CLASS_SIZE:
#include <iostream.h>
#define CLASS_SIZE 50
void main(void)
{ int test_scores[CLASS_SIZE] ; char grades[CLASS_SIZE] ; int student; for (student = 0; student < CLASS_SIZE; student++) get_test_score(student); for (student = 0; student < CLASS_SIZE; student++) calculate_grade(student) ; for (student = 0; student < CLASS_SIZE; student++) print_grade(student); }
В данном случае для изменения количества студентов во всей программе необходимо изменить только одну строку, которая содержит директиву #define, определяющую эту константу:
#define CLASS_SIZE 55
Замена выражений макрокомандами
Если программы выполняют реальные вычисления, то в общем случае код будет содержать сложные выражения типа:
result = (х*у-3) * (х*у-3) * (х*у-3);
В данном случае программа вычисляет куб выражения (х*у-3). Чтобы улучшить читаемость программы и уменьшить вероятность внесения ошибок из-за опечаток, создайте макрокоманду с именем CUBE, которую программа может использовать следующим образом:
result = CUBE(x*y-3);
И опять общепринятым среди программистов считается использование больших букв для имен макрокоманд, чтобы отличить их от функций.
Для создания макрокоманды следует использовать директиву препроцессора #define. Например, следующий оператор создает макрокоманду CUBE:
#define CUBE(x) ((х)*(х)*(х))
Программа определяет макрокоманду CUBE для умножения параметра х на самого себя дважды. Следующая программа SHOWCUBE.CPP использует макрокоманду CUBE для вывода куба значений от 1 до 10:
#include <iostream.h>
#define CUBE(x) ((x)* (x)* (x))
void main (void)
{ for (int i = 1; i <= 10; i++) cout << "Для " << i << " куб равен " << CUBE(i) << endl; }
При компиляции этой программы препроцессор C++ заменит каждый экземпляр макрокоманды CUBE соответствующим определением. Другими словами, замена макрокоманды препроцессором приведет к следующему коду:
#include <iostream.h>
#define CUBE(x) ((х)*(х)*(х)) void main(void)
{ for (int i = 1; i <= 10; i++) cout << "Для " << i << " куб равен " << ((i) * (i) * (i)) << endl; }
Следует обратить внимание, что предыдущая макрокоманда поместила параметр х внутрь круглых скобок, использовав запись ((х)*(х)*(х)) вместо (х*х*х). При создании макрокоманд нужно помещать параметры в круглые скобки, как показано выше, чтобы быть уверенным, что C++ трактует выражения именно так, как требуется. C++ использует старшинство операций для определения порядка выполнения арифметических операций. Предположим, например, что программа использует макрокоманду CUBE с выражением 3+5-2, как показано ниже:
result = CUBE(3+5-2);
Если макрокоманда заключает свой параметр в круглые скобки, то препроцессор сгенерирует следующий оператор:
result = ((3+5-2) * (3+5-2) * (3+5-2));
Однако, если в определении макрокоманды опустить круглые скобки, препроцессор сгенерирует следующий оператор:
result = (3+5-2*3+5-2*3+5-2);
Если вычислить оба выражения, то можно обнаружить, что их результаты отличаются. Избавиться от подобных ошибок можно, заключая аргументы макрокоманды в круглые скобки.