【问题标题】:Why is 16 printed instead of 17 and the variable not incremented?为什么打印 16 而不是 17 并且变量不递增?
【发布时间】:2020-08-14 18:51:15
【问题描述】:
#include<iostream.h>
void main()
{
    int A=5,B=10;
    for(int I=1;I<=2;I++)
    {
        cout<<"Line1="<<A++<<"&"<<B-2<<endl;
        cout<<"Line2="<<++B<<"&"<<A+B<<endl;
    }
}

这个程序的输出是

Line1=5&8
Line2=11&16
Line1=6&9
Line2=12&18

我认为它会在输出的第二行和第四行中生成 17 和 19 来代替 16 和 18。这是因为,在循环的第一次运行中,首先 A 的值是 5,第一个命令打印 5&8 并且应该将 A 的值增加 1,使其变为 6。在第二个命令中,它应该打印 11&(6+ 11) 应该打印 11&17 但输出不是那样。

我的推理漏洞在哪里??

【问题讨论】:

标签: c++ loops variables increment


【解决方案1】:

我不是这方面的专家,但我相信这是因为在后台执行的操作顺序。

主要是“

cout<<"Line2="<<++B<<"&"<<A+B<<endl;

编译器必须做一些花哨的技巧才能使其工作。 程序运行此类代码的方式是从右到左。 因此,从本质上讲,它的运行方式与您认为的方式相反。 首先它推动 endl,然后它做 A+B 并推动它,然后它推动 &,然后它增加 B 并且它也推动它,最后它推动 Line2= 形成完整的“句子”。然后将它们带到控制台(或您可能拥有的任何其他东西)以立即打印到您的屏幕上。

作为解决问题的方法,尝试将 cout 分成 2 行;像这样:

cout <<"Line2="<<++B<<"&";
cout <<A+B<<endl;

或者,如果允许,尝试交换 ++B 和 A+B,这也应该可以解决问题,但是您的结果也会相反。

cout<<"Line2="<<A+B<<"&"<<++B<<endl;

tl;dr:A+B 发生在 B++ 之前,分行执行或交换位置应该可以解决问题

【讨论】:

  • 回复:“程序运行此类代码的方式是从右到左”——不一定。是的,A+BB++ 之前进行了评估,如果这是您看到的结果。但这不是语言定义所要求的。事实上,这段代码导致了未定义的行为(语言定义并没有告诉你程序做了什么),因为A 的值被修改并在同一个语句中读取。摆弄操作顺序并不能解决这个问题。它可能会使代码按照您的预期进行,但如果您使用不同的编译器或不同的设置,它可以(并且将会)改变。
猜你喜欢
  • 2014-05-05
  • 1970-01-01
  • 1970-01-01
  • 2016-10-17
  • 2017-06-15
  • 2016-04-01
  • 2016-02-11
  • 2017-08-29
  • 2021-09-26
相关资源
最近更新 更多