读书人

为啥程序1和程序2执行结果不同

发布时间: 2013-09-06 10:17:17 作者: rapoo

为什么程序1和程序2执行结果不同?

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

struct Test {
int value;
char *info;

void init();
void destroy();
void display();
};
void Test::init()
{
value = 10;
info = "";
}
void Test::destroy()
{
info = false;
}
void Test::display()
{
cout<<"value = "<<value<<"\t"
<<"*info: "<<info<<endl;
}

int main(int argc,char** argv)
{
Test tt;
tt.init();
if(tt.info)
tt.display();
tt.destroy();
if(tt.info)
tt.display();
return 0;
}


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

struct Test {
int value;
char *info;

void init();
void destroy();
void display();
};
void Test::init()
{
value = 10;
//info = "";
}
void Test::destroy()
{
info = false;
}
void Test::display()
{
cout<<"value = "<<value<<"\t"
<<"*info: "<<info<<endl;
}

int main(int argc,char** argv)
{
Test tt;
tt.init();
if(tt.info)
tt.display();
tt.destroy();
if(tt.info)
tt.display();
return 0;
}



请解释一下:
1. 为什么程序1和程序2执行结果不同?
2. info = false, 是什么玄机,到底发生了什么?
[解决办法]
在初始化时,指针的值是不确定的,就是第二个程序的info执行init之后,info的值还是不能确定的
info = false,应该是把0赋值给了info
[解决办法]
程序一:info你初始化指向一个常量字符窗口,然后赋值false 其实false被转换成了NULL,info成了一个空指针。
程序二,你没有初始化info指针,所以你在第一次判断的时候是可以成功的,这是后你尝试输出一个没什么定义的地址空间内容,出现错误。
[解决办法]
引用:
Quote: 引用:

在初始化时,指针的值是不确定的,就是第二个程序的info执行init之后,info的值还是不能确定的


info = false,应该是把0赋值给了info


1.info初始化既然是不确定的,为什么两个程序执行destroy()之前,都是输出的空字符串呢?
2.第二个既然 0 赋给了 info,为什么 if(tt.info) 还能生效?


引用:
Quote: 引用:

在初始化时,指针的值是不确定的,就是第二个程序的info执行init之后,info的值还是不能确定的
info = false,应该是把0赋值给了info

1.info初始化既然是不确定的,为什么两个程序执行destroy()之前,都是输出的空字符串呢?
2.第二个既然 0 赋给了 info,为什么 if(tt.info) 还能生效?


1. 对没初始化的指针其指向是不确定的,你换别的编译器和操作系统也有可能打印出东西来
2. 你是说调用完destroy()后if(tt.info)还判断为true??
[解决办法]
与大家共勉

根据编译器的不同,false的值不一定就是0就像NULL不一定就是0一样

说以如果将false赋值给其他类型时,像if(tt.info)这样的判断可能不是你想要的结果
[解决办法]
引用:
与大家共勉

根据编译器的不同,false的值不一定就是0就像NULL不一定就是0一样

说以如果将false赋值给其他类型时,像if(tt.info)这样的判断可能不是你想要的结果

有理
[解决办法]
什么C++编译器的false不是0? 那也解释不了两个程序不同行为啊? 难度还有编译器里的 false 一会是0一会不是0的?

无论如何, 我这里重现不了楼主的情况, 不知道楼主是如何断定程序2在destroy之后, info依然有值的?
我在main函数里的 tt.destroy(); 之后加了一行
std::cout << "WTF((" << (void*)tt.info << "))WTF" << std::endl;
这行输出
WTF((00000000))WTF
从无例外!
[解决办法]
语言只规定bool的真是true,假是false,没有规定true变成整数必须是1,false必须是0,编译器厂商自然就有选择的权利

说这末多没用,事实胜于熊便,cfree5.0,两个程序结果一样,试一试即可
[解决办法]
这道题有意思?不管结果是什么,你这写法就是错的,实际项目中更是没有任何意义。
[解决办法]
true未必是1,但是false必然是0,主要是为了兼容c,编译器如果false都不是0,可以说太垃圾了

读书人网 >C++

热点推荐