【问题标题】:Can't understand x *= y+1 output无法理解 x *= y+1 输出
【发布时间】:2014-08-01 06:02:41
【问题描述】:

我无法理解代码的输出。任何解释请...

#include<stdio.h>
void main()
{
     int x=2,y=5;
     x*=y+1;
     printf("%d",x);
}

输出为 12。但根据我的理解,x*=y+1;x=x*y+1;,但根据运算符优先级,x*y 应该被评估,然后是adding 1,所以它应该是 10+1=11。但它是 12 - 谁能解释一下吗?

【问题讨论】:

  • 您使用哪个编译器?使用 GCC。
  • 这是int main(void),而不是void main()
  • @Aashu:他使用哪个编译器并不重要。代码行为正确,没有编译器会出错。
  • @KeithThompson:除了在 Windows 上,鉴于printf() 末尾缺少换行符,这可能就是它正在运行的地方。是的,应该是int main(void),但MS 确实允许void main()
  • 这是一个重复的问题;困难在于找到(最好的)副本。

标签: c


【解决方案1】:

它将被评估为

x = x * (y + 1);

所以

x = 2 * ( 5 + 1 )
x = 12

【讨论】:

  • 感谢您的解释
【解决方案2】:

这里发生的事情是编程中操作的顺序是如何发生的。

是的,如果你有这个等式x*y+1,那就是(x * y ) + 1,结果是十一。

但在编程中,= 符号右侧的方程在被 = 符号之前的符号修改之前已求解。 在这个等式中它是相乘的。

所以 x *= y + 1 实际上是 x = x * ( y + 1 ) 即 12。
^ 在这种情况下,asterisk(*) 将右侧的整个等式乘以 x,然后将 那个 结果分配给 x

【讨论】:

  • +1 这应该是答案。因为它解释了评估顺序的原因。
【解决方案3】:

翻译成:x = x*(y+1);

很明显它会打印出 12。

【讨论】:

    【解决方案4】:

    你的理解是正确的,但它是这样的:

    x*=y+1;  =>  x = x * (y + 1);
    

    现在申请BODMAS

    【讨论】:

    • BO=括号打开,D=除,M=多,A=加,S=减。这是解决语句的命令。
    • 我怀疑编程语言每次都遵循 bodmas
    • 它帮助像我这样的初学者,以简单的方式理解。
    【解决方案5】:

    x *= y + 1x = x * (y + 1)

    运算符+ 的优先级高于运算符*=

    【讨论】:

      【解决方案6】:

      x*=y;x=x*y; 类似 这里x*=(y+1) 正在像x = x * (y + 1); 一样扩展

      【讨论】:

        【解决方案7】:

        *= 和类似的运算符是C assignment operators 的一种类型,即这些运算符不同于* 等。

        现在从C operator precedence 开始,这些运算符的优先级最低(高于,),因此将首先评估y + 1,然后评估*=,并将结果分配给x

        【讨论】:

          【解决方案8】:

          它评估为

          x = x * (y + 1);
          

          所以

          x = 2 * (5 + 1) = 12
          

          看看Operators order,你会明白为什么在这种情况下它会被这样评估。

          【讨论】:

            【解决方案9】:

            这里来自operator procedure in c 你可以看到

            加法/减法赋值比简单的加法操作要简单。

            所以这里

            x*=y+1;

            + 先执行。

            所以

            x = x * (6)
            

            所以 x = 2 * 6

            x = 12;
            

            【讨论】:

              猜你喜欢
              • 2023-01-12
              • 1970-01-01
              • 1970-01-01
              • 2011-03-28
              • 1970-01-01
              • 2016-12-07
              • 1970-01-01
              • 1970-01-01
              • 2021-03-08
              相关资源
              最近更新 更多