【问题标题】:How is the assignment operator treated in the first expression of the ternary operator?三元运算符的第一个表达式中的赋值运算符如何处理?
【发布时间】:2021-06-10 05:27:25
【问题描述】:

如果我在下面代码的三元运算符的第一个表达式中给出一个等于关系运算符,那么它输出10,20,我明白了。

#include <stdio.h>

int main()
{
    int a=10, c, b;
    
    c = (a==99) ? b = 11:20;
    
    printf("%d, %d", a, c);

    return 0;
}

但是,当我放置 赋值 运算符而不是 等于 关系运算符(代码如下)时,它会输出 99, 11。现在我不明白这个 Assignment 运算符在三元运算符的第一个表达式中是如何处理的。

#include <stdio.h>

int main()
{
    int a=10, c, b;
    
    c = (a=99) ? b = 11:20;
    
    printf("%d, %d", a, c);

    return 0;
}

【问题讨论】:

  • 赋值运算符将 a 设置为 99,因为 99 是一个非零值,所以它是真的。所以 c 设置为 11。
  • b = 11部分,b设置为11,b的值为“返回”,所以条件为真时c也设置为11。
  • 这能回答你的问题吗? What does an assignment return?
  • @PaulHankin 是的,我得到了答案。我会接受答案。
  • 值得注意的是,将= 与其他运算符混合被认为是非常糟糕的做法,除非它用于存储最终结果。在同一个表达式中有多个赋值是一些主要的代码臭味。 =?: 都是危险的运算符,带有许多微妙的特殊规则。由于单行中的大多数运营商没有奖励,因此应将此类行分成几行。

标签: c conditional-operator assignment-operator


【解决方案1】:

a=99 是赋值给变量a 的值9999 在 C 中为真,因此变量 cb 在您的第二个程序中都被赋值为 11

【讨论】:

    【解决方案2】:

    赋值运算符将变量a设置为99,任何大于零的值都为真,所以它返回True并将变量c设置为11。

    【讨论】:

      【解决方案3】:

      这一行

      c = (a==99) ? b = 11:20;
      

      做同样的事情

      if (a == 99)
      {
          c = b = 11;
      }
      else
      {
          c = 20;
      }
      

      这一行也是如此

      c = (a=99) ? b = 11:20;
      

      做同样的事情

      if (a = 99)
      {
          c = b = 11;
      }
      else
      {
          c = 20;
      }
      

      有趣的部分是

      if (a = 99)
      {
          ...
      

      执行对a 的赋值,然后检查赋值是零(假)还是非零(真)。所以可以写成:

      a = 99;
      if (a != 0)
      {
          ...
      

      顺便说一句:if (a != 0)也可以写成if (a)

      【讨论】:

      • 我们可以简单地说 a = 99 意味着 true 作为一个条件。
      • @RAWNAKYAZDANI 正确。使用a = 0 作为条件会产生假,而a = non-zero-value 作为条件会产生真。
      猜你喜欢
      • 2013-06-28
      • 1970-01-01
      • 2021-04-29
      • 1970-01-01
      • 2017-07-16
      • 2021-11-23
      • 2012-01-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多