【问题标题】:Use of the ternary operator: var ? 12-var : 0三元运算符的使用: var ? 12 变量:0
【发布时间】:2013-04-06 01:51:47
【问题描述】:

非常感谢您抽出宝贵时间!我无法理解我的音频编码教科书中的语句语法。在一个例子中,有一个打印功能是这样的

printf("%d semitones up or %d semitones down\n", interval,
       interval ? 12-interval : 0 );

我不明白的部分是条件运算符,或“?”。似乎我应该将其读为“如果间隔不等于 0,则间隔 = 12 - 间隔”,但这里的语法似乎很奇怪。我习惯了条件运算符是一个更加充实的语句,例如:

a = b > c ? b : c;

"如果 b 大于 c,则大于 a = b;否则 a = c"

有人可以为我指出任何其他参考资料,或解释更多有关此语法的信息吗?我找不到类似的例子。

【问题讨论】:

    标签: c operators conditional


    【解决方案1】:

    您几乎是对的,但没有分配任务。它的意思是“如果interval 不为零,则将12 - interval 传递给printf 语句,否则传递0”。

    三元运算符一般是这样的:

      a ? b : c
    

    其中abc 都是表达式。如果a 的计算结果为非零,则三元运算符的计算结果如同b,如果a 的计算结果为0,则三元运算符的结果为c 的计算结果。

    您的第二个示例是三元运算符和赋值运算符的组合。三元运算符本身不执行任何赋值。

    【讨论】:

      【解决方案2】:

      任何产生布尔值的表达式都可以。在 C 的情况下,整数可以用作布尔值,值 0 被认为是 false,其他任何值都被认为是 true

      因此,在您的情况下,interval ? 12-interval : 0 表示:如果interval 不为零,则使用12-interval,否则使用0。为了更加冗长,您可以将其重写为:

       interval != 0 ? 12-interval : 0
      

      【讨论】:

      • _Bool(可通过stdbool.h 用作bool)已成为标准C 的一部分已有近15 年了。
      • 我的错误。没听说过,没用过。谢谢(你的)信息。我只接受过使用 K&R 的正式培训,之后再没有进行过任何正式的 C 培训。我更新了我的答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-09
      • 2016-10-14
      • 2016-09-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多