昨晚我花了1个小时进行调试。我正在编写一个Huffman_coding程序。我的错误的代码的一部分是打击:
class HTree
{
public:
HTree* left;
HTree* right;
int weight;
char ch;
HTree(){left = right = NULL; ch = '\0'; weight = 0;}
HTree(HTree* l, HTree* r, char c, int w){left = l; right = r; ch = c; weight = w;}
~HTree(){delete left; delete right;}
bool ISleaf(){return !left && !right;}
};
这是HTree* BuildTree(int* frequency)
中的一段代码:
QTree.push(new HTree(NULL, NULL, frequency[i], (char)i));
可以看出,这两个参数的顺序是反向的 - char c, int w
和frequency[i], (char)i
。我一开始并没有意识到这个小错误。输出当然是错误的。
但我的问题是,为什么它仍然可以编译?或者它为什么还能运行?因为答案/ cout是完全错误的。根据不同的类型,我认为它无法成功编译 - char != int
,我是对的吗?
谁能告诉我为什么会这样?它会自动将int
转换为char
和char
转换为int
,然后它可以编译并运行,并得到错误的答案吗?
好吧,让我更明确地指出,我的主要问题不是它是否可以自动交谈,它是为什么我的答案是错误的如果converse可以自动发生。
输出错误:
提前致谢!
答案 0 :(得分:2)
如果目标类型比源类型宽,C ++可以使用隐式转换将字符(即8位整数)转换为int(这里的情况就是这种情况)(int通常为16或32位宽,具体取决于平台, char是8位)。 将int分配给char时,编译器通常会打印一条警告消息(但分配将起作用)。
答案 1 :(得分:1)
是的,从char
到int
以及int
到char
都有隐式转换。
答案 2 :(得分:0)
这是错误的,因为您使用某个i
值初始化每个HTree对象而不是频率。 c
成员已按频率初始化。因此,因为你的代码会被编译并运行,并且一直产生错误的结果。