为什么在更改不同类型的不同参数的位置后仍然可以编译/运行?

时间:2016-01-28 16:33:51

标签: c++ huffman-code

昨晚我花了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 wfrequency[i], (char)i。我一开始并没有意识到这个小错误。输出当然是错误的。

但我的问题是,为什么它仍然可以编译?或者它为什么还能运行?因为答案/ cout是完全错误的。根据不同的类型,我认为它无法成功编译 - char != int,我是对的吗?

谁能告诉我为什么会这样?它会自动将int转换为charchar转换为int,然后它可以编译并运行,并得到错误的答案吗?

好吧,让我更明确地指出,我的主要问题不是它是否可以自动交谈,它是为什么我的答案是错误的如果converse可以自动发生。

输出错误:

enter image description here

正确的输出: enter image description here

提前致谢!

3 个答案:

答案 0 :(得分:2)

如果目标类型比源类型宽,C ++可以使用隐式转换将字符(即8位整数)转换为int(这里的情况就是这种情况)(int通常为16或32位宽,具体取决于平台, char是8位)。 将int分配给char时,编译器通常会打印一条警告消息(但分配将起作用)。

答案 1 :(得分:1)

是的,从charint以及intchar都有隐式转换。

答案 2 :(得分:0)

这是错误的,因为您使用某个i值初始化每个HTree对象而不是频率。 c成员已按频率初始化。因此,因为你的代码会被编译并运行,并且一直产生错误的结果。