【问题标题】:Explain an C expression with ? : and >用 ? 解释 C 表达式: 和 >
【发布时间】:2025-12-23 14:35:07
【问题描述】:

谁能解释一下在 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() 只是一个字符串(在 Unix/Linux 中参数始终被视为字符串)到double 的 libc 转换,不提供错误(转换时)处理。

我说的对吗?

【问题讨论】:

  • 不,它表示第二个和第三个元素(如果给出)。在 C 中,数组从 [0] 开始索引。如果这些来自int main(int argc, char *arg[]),则第一个元素是可执行文件的名称,以下元素将是命令行的第一个、第二个参数
  • 但是argv[0]: 是运行的程序的名字,所以不是真正的参数。

标签: c operators argc


【解决方案1】:

irateorate 应该从命令行提供,分别作为可执行文件名之后的第一个参数 (argv [1]) 和第二个参数 (argv [2])。

表达式

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

不初始化正确的变量,但前提是已经提供了相应的参数。如果不是,则转换将毫无意义,因此分配了一个默认值 (1)。

orate 也可以这样说:如果没有提供相应的参数,则分配默认值 2

【讨论】:

    【解决方案2】:
    double irate = argc > 1? atof(arg[1]) : 1;
    

    可以写成:

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

    或者可以理解为:如果参数计数大于1,则将第二个参数从ascii字符串转换为float并存储在变量irate中,否则设置为1。

    第二行也一样。

    看看Conditional operator

    【讨论】: