【问题标题】:What happens when a variable is assigned to zero in an `if` condition?当一个变量在“if”条件下被赋值为零时会发生什么?
【发布时间】:2013-07-09 05:35:12
【问题描述】:

如果有人能解释一下,那将很有帮助。

int main()
{
 int a=0;
 if(a=0)
       printf("a is zero\t");
 else
       printf("a is not zero\t");
 printf("Value of a is %d\n",a);
 return 0;
}

这个输出是

a is not zero   Value of a is 0 

【问题讨论】:

  • 你的代码有错:if(a=0)应该是if(a==0)
  • 标题说“再次分配零”所以第二次分配可能是故意的。但由于普遍缺乏明确性和研究,我投票结束。
  • @AndreyT 问题是消息的文本是倒着的……如果它们倒过来就好了。
  • @Barmar 除非有评论说 // I explicitly intend assignment here ... 这与这个问题的标题非常接近。
  • @Ani: Er... 如果在逻辑上下文中被视为false(例如在if 下),则值为零。因此,您的ifelse 分支被占用。为什么您在该分支中写"a is not zero" 对您来说确实是一个问题。是你,出于某种奇怪的原因将这些消息“向后”排列。仅此而已。

标签: c


【解决方案1】:

赋值的结果就是表达式的值

因此:

if (a = 0)

等同于:

if (0)

等同于:

if (false)

这将强制使用else 路径。

【讨论】:

    【解决方案2】:
    if(a=0)
           printf("a is zero\t");
     else
           printf("a is not zero\t");
    

    这些消息恰好是倒退的。 if后面的语句如果条件isn't 0就执行,else后面的语句如果条件is 0就执行,所以应该是

    if(a=0)
           printf("a is not zero\t");
     else
           printf("a is zero\t");
    

    或者,等价但更清楚,

    a = 0;
    if(a)
           printf("a is not zero\t");
     else
           printf("a is zero\t");
    

    其中,连同

    printf("Value of a is %d\n",a);
    

    会打印

    a is zero   Value of a is 0 
    

    正如预期的那样。

    【讨论】:

    • @PHIfounder 我知道,奇怪的是,SO 中有多少人——程序员——不注意细节。感谢您的支持。我想如果我匆匆忙忙而不是花时间把它做对,我会得到更多……当接受的答案发布时,我还在写。
    【解决方案3】:

    If () 函数接受真或假值作为参数。

    所以你放在括号内的任何东西对 if() 函数没有意义,但它有什么价值。

    '0' 在任何情况下都被视为假值,因此当您将 0 作为参数传递时:

    if(0)
    {
      ---statments---
    }
    

    语句部分不会被执行,系统会直接跳转到else部分。

    在您提到的情况下,您将 0 分配给变量并将其作为参数传递给 if()。 注意 if() 只接受 0 或非 0 值。所以,你做了什么任务并不重要。 if() 将接收变量 'a' 的值作为参数并采取相应的行动。

    此时,由于a的值为0,if部分不会被执行,系统会跳转到else。

    【讨论】:

      【解决方案4】:

      if(a=0) 是变量a0 的赋值。如果您想将a 与零进行比较,您需要编写如下 if(a==0)

      您的条件是简单的赋值,将a 设为零,因此条件变为假,您将得到来自else 部分的打印。

      【讨论】:

      • OP 不想要 ==。 OP 已经非常清楚地表明了分配的意图。
      • @JimBalter 是的,我知道,这就是为什么我给出了条件失败的原因以及为什么从其他部分打印。我建议比较也只是为了安全起见。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-14
      • 2023-04-04
      • 2022-11-03
      • 2022-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多