0如何在C语言的条件运算符中使用?

How is 0 used in conditional operator in C?

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

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

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

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++;

在 C 语言中,三元 是 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 */
}

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

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

有人可能想写 a == b ? i++ : 0; 的原因是 s/he 可能希望有一个(注意!您现在正在进入一个基于意见的领域)更容易和更快的替代 if (a == b) i++; - 虽然这当然是基于意见的,但我个人并不同意相同的意见。

我认为 if 语句中的 "blocker" 是要求写括号 () ,这可以通过使用条件运算符来省略。


"但是为什么 0?"

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

a == b ? i++;

编译器会报错:

"error: expected ':' before ';' token"

或者分别这样做:

a == b ? i++ : ;

会提高:

"error: expected expression before ';' token"

所以他们使用 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;

这里 c 要么被 i 赋值,要么被 0 赋值,取决于 a == b 是否为真。如果 a == b 为真,则 ci 赋值。如果a == b错误,c0赋值。


旁注:

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

中的一个

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

?: 运算符是一个三元 运算符,但它不被称为"ternary",正如这里的某些答案and/or 评论所暗示的那样。它只是运算符的元数,就像 + 二元 运算符或 & 是一元运算符一样。如果它有名字的话,那就是 "Conditional Expression"-operator

它不完全等同于 if/else,因为它是第一个条件 value(结果是两个表达式必须具有相同的类型)地方,不是有条件的执行。当然,两种类型都可以强制转换,使它们相等。

对于 OP 所做的事情,我认为更好的选择(如果 if 不得使用):

a == b && i++;

这看起来更合乎逻辑。但当然这是风格问题。