使用 ? : 第一次用C

Using ? : in C for the first time

我刚开始 类 在我的学校学习编程,我第一次学会了如何使用 ? :。我的第一个问题是这个叫什么,因为我的教授没有说它叫什么。

其次,我正在编写一个程序,在给定偶数时打印偶数,在给定奇数时打印奇数。我想这样写

int main() {
    int x = 3;
    char *string;

    if (x % 2 == 0 ? string = "Even" : string = "Odd");

    printf("%d is %s", x, string);
}

问题是我在 if (x % 2 == 0 ? string = "Even" : string = "Odd"); 处收到错误 error: lvalue required as left operand of assignment,这是 string = "Odd" 部分。

是否不允许我将表达式分配给 if( ? : ) 内的变量?我想让我的代码简短,而不是像

这样写
if (x % 2 == 0) {
    printf("%d is Even", x);
} else {
    printf("%d is Odd", x);
}

不要使用三元运算符在每个子句中调用语句。也就是说,不要将其用作 if/else 的替代品。将其用于作业:

而不是这个:

if (x % 2 == 0 ? string = "Even" : string = "Odd");

这个:

string = (x % 2 == 0) ? "Even" : "Odd";

这个运算符 ?: 在 C 中称为条件运算符。程序员也称它为三元运算符,因为该运算符有三个操作数。

在C中定义如

conditional-expression:
    logical-OR-expression
    logical-OR-expression ? expression : conditional-expression

赋值运算符的优先级低于条件运算符。

if 语句中的这个条件运算符

if (x % 2 == 0 ? string = "Even" : string = "Odd");

不正确。实际上相当于

if ( ( x % 2 == 0 ? string = "Even" : string ) = "Odd" );

如果 if 语句中的条件运算符将正确编写为

if (x % 2 == 0 ? string = "Even" : ( string = "Odd" ) );

尽管如此,使用 if 语句本身没有任何意义,因为 if 语句中的表达式 returns 是一个指向字符串文字的指针,它不是空指针。也就是说,这个 if 语句没有子语句,它的条件总是计算为逻辑真。

你只需要写下面的语句

x % 2 == 0 ? string = "Even" : ( string = "Odd" );

或像

这样更具可读性
x % 2 == 0 ? ( string = "Even" ) : ( string = "Odd" );

或更简单

string = x % 2 == 0 ? "Even" : "Odd";

注意C和C++中条件运算符的定义不同。在 C++ 中,运算符定义为

conditional-expression:
    logical-or-expression
    logical-or-expression ? expression : assignment-expression

如你所见,第三个表达式可能是一个赋值表达式。这意味着您可以用 C++ 编写您的条件运算符,如

x % 2 == 0 ? string = "Even" : string = "Odd";

不将第三个操作数括在括号中。

它被称为“条件运算符”。因为它是 C 和 C++ 中 唯一 最著名的三元运算符(意​​味着它接受操作数),所以许多人称它为三元运算符。

Conditional Operator: ? :

expression ? expression : expression

The conditional operator (? :) is a ternary operator (it takes three operands). The conditional operator works as follows:

The first operand is implicitly converted to bool. It is evaluated and all side effects are completed before continuing.

If the first operand evaluates to true (1), the second operand is evaluated.

If the first operand evaluates to false (0), the third operand is evaluated.

The result of the conditional operator is the result of whichever operand is evaluated — the second or the third. Only one of the last two operands is evaluated in a conditional expression.

判断表达式类型的规则有点复杂。简单来说它的类型就是第二个和第三个操作数之间的公共类型

?: 称为三元或条件运算符。

最后两行可以像这样合并成一行:

printf("%d is %s\n", x, (x % 2 == 0) ? "Even" : "Odd");

您也不需要 string 变量。