【问题标题】:Using ? : in C for the first time使用 ? : 第一次用 C
【发布时间】:2021-09-30 02:46:17
【问题描述】:

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

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

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 更具可读性。 ...这叫什么...这叫三元运算符。
  • 您不要在if 语句中使用?:。当您想将值分配给同一个变量时,使用它而不是 if 语句。
  • 我想通了,我只是写了string = (x % 2 == 0 ? "Even" : "Odd");
  • 这能回答你的问题吗? If statement with ? and :
  • 你可以在条件内赋值,但是由于默认优先级,你需要添加括号。

标签: c conditional-operator


【解决方案1】:

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

而不是这个:

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

这个:

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

【讨论】:

  • 认为“正式”名称(根据标准)是“条件运算符”,但术语“三元运算符”被广泛使用。
  • 在我写完我的问题之后,我尝试了这个并且它成功了。之后我觉得很傻。这正是我想要的。
  • @AdrianMole ternary 运算符来自它的外观,即 A ? B : C,其中 A 包含条件。正常的赋值也可以称为 binray 运算符。然而没有 quaternaryquintuple 等等......
【解决方案2】:

这个操作符 ?: 在 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 语句中的表达式返回一个指向字符串文字的指针,该指针不是空指针。也就是说,这个 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";

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

【讨论】:

    【解决方案3】:

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

    Conditional Operator: ? :

    expression ? expression : expression
    

    条件运算符 (? :) 是一个三元运算符(它需要三个 操作数)。条件运算符的工作原理如下:

    第一个操作数被隐式转换为布尔值。它被评估和 在继续之前完成所有副作用。

    如果第一个操作数的计算结果为真 (1),则第二个操作数为 评估。

    如果第一个操作数的计算结果为 false (0),则第三个操作数为 评估。

    条件运算符的结果是任何一个的结果 计算操作数——第二个或第三个。只有最后一个 在条件表达式中计算两个操作数。

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

    【讨论】:

    • 它实际上并不是唯一的三元运算符。根据 C 2018 6.5.2,用于函数调用的 () 是一个运算符,foo(a, b) 具有三个操作数。同样,_Generic 是一个运算符,_Generic(foo, int: 0, default: 1) 有三个操作数。
    • @EricPostpischil 我不知道,但现在我想它是完全有道理的。你每天都会学到一些东西:)
    【解决方案4】:

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

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

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

    您也不需要string 变量。

    【讨论】:

      猜你喜欢
      • 2011-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多