2015-10-27 69 views
0

我想打印数字并在它们之间放置一个空格,但在编译后我发现我留下了那个+运算符(C#练习)。当我运行这个程序时,它立即停止工作,但文本文件中有一个非常奇怪的输出。为什么这样的文本文件?奇怪的文件输出C++

#include <iostream> 
#include <fstream> 
using namespace std; 

    int main() 
    { 
     int i=0; 
     ofstream f("out.txt"); 
     while(i != -1) 
     { 
      f << " " + i++; 
     } 
     return 0; 
    } 

从551KB文件中的一些行:

deleted virtual method called 
eleted virtual method called 
leted virtual method called 
eted virtual method called 
ted virtual method called 
ed virtual method called 
d virtual method called 
virtual method called 
virtual method called 
irtual method called 
rtual method called 
tual method called 
ual method called 
al method called 
l method called 
method called 
method called 
ethod called 
thod called 
hod called 
od called 
d called 
called 
called 
alled 
lled 
led 
ed 
d 

回答

1

当您添加到一个字符串一个整数,它执行指针运算。因此" " + i++获取字符串文字的地址,向其添加i,并递增i。然后它将加法的结果传递给<<,因此无论该C地址字符串是在该地址打印到文件。

由于您正在访问字符串文字内存的边界之外,因此导致了未定义的行为。所以它正在向文件写入垃圾。它看起来像你的字符串文字包含来自运行时库的内部错误消息之后的内存,并且正在打印该字符串。由于每次都会增加i,每次迭代都会在消息的后面开始一个字符。

你也有一个实际上无限循环,因为增加i不会导致-1,直到它溢出并回绕。

+0

整数溢出会导致未定义的行为,因此它可能永远不会导致-1。例如,编译器可以优化该测试。 –