【问题标题】:What does this if assignment/statement mean in C++如果赋值/语句在 C++ 中意味着什么?
【发布时间】:2015-04-05 21:35:52
【问题描述】:

我们的教授给了我们这个代码。它根据数组中第一个索引的值为 char[] 分配一个值。他说这是一个 if 语句,但我从未见过这样的语句。我是 C++ 新手

temp.byte[0] = byte[0] == '0' ? '1' : '0';

【问题讨论】:

  • 如果 byte[0] == '0' 那么 temp.byte[0] 等于 '1' 否则 '0'
  • 这应该作为副本关闭。

标签: c++ if-statement conditional-statements variable-assignment


【解决方案1】:

Ternary operators 在很多语言中都很常见。它大致相当于返回第一个或第二个值的if。第一个值在 true 的情况下使用,第二个在 false 的情况下使用。记住这一点的一种方法是condition? 是一种问题,然后是答案。

有一些使用它们的指南:

  • 当等价的 if 更简单时,不要使用三元。
  • 不要嵌套它们。
  • 除非您将结果分配给某物,否则请勿使用三元。
  • 尽量避免在函数参数中使用它们。
  • 不要使用否定条件,而是颠倒最后两部分的顺序。

【讨论】:

  • 不太确定我是否同意您的指导方针。第一个是重言式:“当 Y 更简单时不要使用 X”对于所有 X 和 Y 都是正确的(包括 X 是 if 语句且 Y 是三元运算符的情况)。嵌套它们是一个常见的习惯用法;它们就像if 一样链接,并且不比嵌套if 更难阅读。至于第三个:可能是我代码中最常用的 ?: 是在返回语句中。至于第四个:一个常用的用法是作为 << 的参数(或 C 中的 printf)。
  • 我可能会补充一点,三元运算符的另一个常见用途是作为初始化程序。 if 无法做到这一点。
  • 我只是在这里提供一些注意事项,以便发现三元组不会导致有人在他们能想到的所有情况下都应用它们。
  • 那么我想说最重要的是将它们格式化为if,条件和每个结果都在不同的行上。 (当然,这对于非常简单的三元表达式来说可能是多余的,特别是当它们被用作参数时。)如果你这样做,并且理解 if-like 嵌套,即使像 return cond1 ? value1 : cond2 ? value2 :... 这样的东西也很容易阅读。
【解决方案2】:

这被称为三元运算符,它们有点奇怪。它们是 if 语句的简写。

格式为:

condition ? if-true : if-false

在这种情况下,条件是is byte[0] == '0'。如果为真,则temp.byte[0] 设置为'1',否则temp.byte[0] 设置为'0'

【讨论】:

    【解决方案3】:

    这行代码相当于:

    if byte[0] == '0'
      temp.byte[0] = '1'
    else
      temp.byte[0] = '0';
    

    这是 c++ 中的基本内容。以 www.learncpp.com 为例

    【讨论】:

    • 这不是完全等价的,除了编译器。如果代码中的关键元素是设置temp.byte[0],那么三元运算符比if 的可读性要高得多。并且它避免了等号左侧的表达式重复。
    • 当然,int i = cond ? value1 : value2;if ( cond ) int value1; else int value2;相同。 (用没有默认构造函数的类型替换int,你会真正看到三元运算符的重要性。)
    • @James Kanze 我的回答声称 OP 给出的示例等同于我编写的代码。 OP 的示例使用普通类型,但不是缺少默认构造函数的类。我的回答并不意味着一般情况下存在等价性。关于您的第一条评论 - 确实使用三元运算符更简洁,但明显更具可读性并不会取消等价性。但最好注意您的评论。
    【解决方案4】:

    这个

    temp.byte[0] = byte[0] == '0' ? '1' : '0';
    

    也可以理解为

    temp.byte[0] = (byte[0] == '0' ? '1' : '0'); //L-value is `temp.byte[0]`
    

    换句话说,

    byte[0] == '0'吗?

    如果是,那么temp.byte[0] = '1'

    否则,temp.byte[0] = '0'

    【讨论】:

      【解决方案5】:

      使用全括号表达式使三元运算符的含义更加清晰:

      temp.byte[0] = ((byte[0] == '0') ? '1' : '0');
      

      【讨论】:

      • 如果 OP 不知道 ?: 是什么意思,添加 () 有什么帮助?
      • 好点。我看到其他帖子已经很好地解释了三元运算符的含义。我认为 OP 的部分困惑源于无法解析表达式,所以我建议使用一种更易读的方式来编写它。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-08
      • 2012-05-29
      • 1970-01-01
      • 1970-01-01
      • 2013-06-05
      • 1970-01-01
      相关资源
      最近更新 更多