Объясняют выражение C с помощью ? : и >

#c #operators #argc

#c #операторы #argc

Вопрос:

Не мог бы кто-нибудь любезно объяснить мне использование следующего выражения в C?

 double irate = argc > 1? atof(arg[1]) : 1;
double orate = argc > 2? atof(arg[2]) : 2;
 

(Взято из начала примера soxr https://sourceforge.net/p/soxr/code/ci/master/tree/examples/1-single-block.c .)

Означает ли это что-то вроде:

«если количество аргументов больше единицы, возьмите первый аргумент и поместите его в irate переменную, в противном случае поместите число 1 в ту же переменную»?

Аналогично со вторым возможным аргументом…

atof() это просто преобразование строки в libc (аргументы всегда обрабатываются как строки в Unix / Linux) в double , обработка ошибок (во время преобразования) не предусмотрена.

Я прав?

Комментарии:

1. Нет, это означает второй и третий элементы (если они заданы). В C массивы индексируются из [0] . Если это from int main(int argc, char *arg[]) , то первый элемент — это имя исполняемого файла, а следующие элементы будут первым, вторым аргументом командной строки .

2. Но argv[0]: это имя запущенной программы, так что это не реальный параметр.

Ответ №1:

 double irate = argc > 1? atof(arg[1]) : 1;
 

Может быть записано как:

 if (argc > 1)
    irate = atof(arg[1]);
else
    irate = 1
 

Или может быть прочитано как: если количество аргументов больше единицы, преобразуйте второй аргумент из строки ascii в число с плавающей запятой и сохраните его в переменной irate, в противном случае установите для него значение 1.

То же самое для второй строки.

Взгляните на Условный оператор

Ответ №2:

irate и orate должны предоставляться из командной строки, соответственно, в качестве первого аргумента после имени исполняемого файла ( argv [1] ) и в качестве второго аргумента ( argv [2] ).

Выражение

  double irate = argc > 1? atof(arg[1]) : 1;
 

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

То же самое можно сказать и о orate : значение по умолчанию 2 присваивается, если соответствующий аргумент не указан.