【问题标题】:How is 0 used in conditional operator in C?C语言的条件运算符中如何使用0?
【发布时间】:2020-05-25 14:40:39
【问题描述】:

C 中的条件运算符是这样使用的: condition ? value_if_true : value_if_false
value_if_false中使用的0是什么意思?

例如,我见过一些人这样使用它。
a == b ? i++ : 0

好像什么都没做。这在其他功能中是否像 return 0 一样工作?

【问题讨论】:

  • 那之前是什么?这可以是一个赋值,例如int c = a == b ? i++ : 0 表示如果为真,c 将为 i(然后 i 将增加),否则 c 将为 0。
  • 你的正确。如果a == b 为真,则完整表达式的结果为i++,如果为假(即a != b),则结果为0。请注意,如果条件为假,i 的增量将不会发生。
  • 如果是完整的语句,那么0可以替换成任何其他数字而不改变结果。
  • if (a == b) i++; 是写这个的理智的方式,如果它被用作一个声明。甚至 i += (a==b); 如果有理由避免使用分支。
  • 从技术角度来看,?= 被称为“条件运算符”。 条件运算符是一组三元运算符之一。

标签: c conditional-operator


【解决方案1】:

在 C 语言中,ternary 是 if 语句的较短版本,它需要两个语句,if_trueif_false。应该是这样的(实际上一个case可以有多个语句,用逗号隔开):

短:

condition ? if_true : if_false;

长:

if (condition) {
    if_true;
} else {
    if_false;
}

如果你在condition 前面放了一些东西,你也可以赋值。 简短:

result = condition ? if_true : if_false;

长:

if (condition) {
    result = if_true;
} else {
    result = if_false;
}

现在这是诀窍。在 C 语言中,写 0; 是一个有效的语句,所以你的三元变成更长的版本,与下面的代码相同:

if (a == b) {
    i++;
} else {
    0; /* This is valid C statement */
}

或者如果你也有任务,那就是:

if (a == b) {
    result = i++;
} else {
    result = 0;
}

您也可以这样做:

int a;
/* Code here ... */
condition ? a = 5: 0;

这实际上等同于:

if (condition) {
    a = 5;
} else {
    /* DO not touch a */
}

【讨论】:

    【解决方案2】:

    ?: 运算符是一个 三元 运算符,但它不像这里的某些答案和/或 cmets 建议的那样称为“三元”。它只是运算符的数量,就像 +binary 运算符或 & 是一元一样。如果它有一个名字,它被称为“条件表达式” - 运算符

    它并不完全等同于 if/else,因为它首先是一个条件 (因此,两个表达式必须具有相同的类型),而不是条件执行。当然,这两种类型都可以强制转换以使它们相等。

    就 OP 所做的事情而言,我认为更好的选择(如果不应使用 if):

    a == b && i++;
    

    这类似于发生的事情更合乎逻辑。但这当然是风格问题。

    【讨论】:

    • 是的,正式名称为“条件运算符”。该标准明确将?: 声明为“条件运算符”-> C18, §6.5.15 条件运算符
    【解决方案3】:

    某人可能想要写a == b ? i++ : 0; 的原因是他/她可能想要一个(注意!您现在进入一个基于意见的领域)更容易和更快的替代if (a == b) i++; - 尽管这是当然基于意见和我个人不同意相同的意见。

    我可以将if 语句中的“阻止程序”视为需要编写括号(),可以通过使用条件运算符来省略它。


    但为什么是0?”

    C 语法要求条件运算符的第三个操作数。否则,如果您想编译例如:

    a == b ? i++;
    

    编译器会报错:

    错误:':' 之前应为 ';' 令牌

    或者分别这样做:

    a == b ? i++ : ;
    

    会提高:

    错误:';' 令牌之前的预期表达式

    所以他们使用0 作为一种“语法满足器”,以便能够使用条件运算符来替代if 语句。您也可以在此处使用任何其他数字值,但0 是最易读的值,这表示它没有其他用途。

    用一个例子来展示用法:

    #include <stdio.h>
    
    int main (void)
    {
        int a, b, c = 4;
        a = 2;
        b = 2;
    
        a == b ? c++ : 0;
    
        printf("%d",c);
        return 0;
    }
    

    c 的输出将是 5,因为 a == b


    请注意,a == b ? i++ : 0 在使用 f.e. 时是不同的。在 f.e. 之类的任务中:

    int c = a == b ? i++ : 0;
    

    这里ci0 分配,取决于a == b 是否为真。如果a == b 为真,则ci 分配。如果a == b 错误,c0 分配。


    旁注:

    从技术角度来看,?= 被称为“条件运算符”。 条件运算符是一组三元运算符之一。

    如果您想了解有关条件运算符 ?= 的更多信息,请查看 ISO:IEC 9899:2018 (C18), §6.5.15 - "Conditional operator" 了解更多信息。

    【讨论】:

    • 我不认为三元比 if 更快。我的意思是,三元是 if...的简写...
    • 我会说这甚至不是基于意见的,而是错误的。但这是我的意见:D
    【解决方案4】:

    0 没有什么特别之处

    a == b ? i++ : 1
    

    它的行为方式也是一样的。

    唯一的区别是当您将表达式分配给另一个变量时:

    int c = a == b ? i++ : 1;
    // a == b -> c will be i++
    // a != b -> c will be 1
    

    不过写起来更干净

    if (a == b) i++;
    

    【讨论】:

    • 谢谢。这个也一样吗?仅当a == b 时,a == b ? c = 1 : 0 1 才会分配给 c。如果没有,它什么也不做。
    • @mjaything 是的,但这是一种奇怪的做法。
    • 请注意,三元运算符是一个带有返回值的表达式,它不仅可以用于赋值。这也可以作为函数参数传递。例如:some_function(a == b ? i++ : 0)
    【解决方案5】:

    将三元运算符视为一种速记方式或编写 if-else 语句会有所帮助。

    If(a == b){
        i++;
    }else{
        //if assigned, return 0. Else do nothing. 
    }
    

    【讨论】:

      猜你喜欢
      • 2023-01-08
      • 2022-11-03
      • 2017-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-26
      • 2020-08-19
      • 1970-01-01
      相关资源
      最近更新 更多