【问题标题】:Why else block is executed if num1, num2, and 0 at the end is assigned to if block?如果最后的num1、num2和0分配给if块,为什么会执行else块?
【发布时间】:2016-08-19 15:50:46
【问题描述】:

在这段代码中

#include <stdio.h>
int main(){
    int i;

    if(i= 50,40)
        printf(" if blk i %d\n",i);
    else
        printf(" else part" );



    return 0;
}

输出为

如果 blk i 50

但是当 if 语句中的赋值部分添加一个零时,它会转到 else 部分。为什么这个 0 让它转到 else 部分?

下面的代码:

#include <stdio.h>
int main(){
    int i;

    if(i= 50,40,0)
        printf(" if blk i %d\n",i);
    else
        printf(" else blk i %d\n", i);

    printf("i %d\n", i);

    return 0;
}

【问题讨论】:

  • 您认为i= 50,40 到底是做什么的?搜索逗号运算符和赋值运算符。 C和C++也是不同的语言!不要添加错误的标签!
  • @olaf 非常感谢逗号操作符,但除此之外,对于这个小代码段,c 和 c++ 的工作方式相同,我只是检查了一下。无论如何,对不起,糟糕的帖子
  • 如果您重载其中一个运算符,则不会。相同的语法和语法并不意味着相同的语义!只需选择您使用的语言。
  • 靠猜测编程是行不通的。

标签: c if-statement variable-assignment


【解决方案1】:

此声明:

if(i= 50,40)

其实是一个:

if(40)

逗号运算符首先将i 分配给50(逗号运算符的优先级低于赋值),然后作为条件使用最后一个元素40

但是当 if 语句中的赋值部分添加一个零时,它会转到 else 部分。

因为作为条件,使用了最后一个元素,即00 导致 if 失败,并执行 else 块。

【讨论】:

    【解决方案2】:

    您正在使用 逗号运算符。使用此运算符的表达式的值是右侧的值。

    在这种情况下:

    (i= 50,40)
    

    i 首先设置为 50,然后计算值 40,因此表达式的值为 40。因为这是一个非零值,它在布尔上下文中计算为 true 并输入 if部分。

    在这种情况下:

    (i= 50,40,0)
    

    发生与上述相同的情况,但随后计算出 0,因此表达式的值为 0。零在布尔上下文中计算为 false,因此它进入 else 部分。

    【讨论】:

      【解决方案3】:

      表达式 a, b 首先计算 a 并丢弃结果。
      然后它计算b,这个值就是表达式的结果。

      i= 50,40 首先计算i = 50,然后生成40 作为其结果。
      由于40 不是0,因此将其转换为true 用于条件。

      i = 50, 40, 0 计算 i = 50,然后是 40,然后是 0,这将成为表达式的值。
      0 转换为 false

      另一方面,i = (50,40) 会将40 分配给i,并完全忽略50

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-11-07
        • 2019-04-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-04
        相关资源
        最近更新 更多