为什么不同类型的不同参数换位置后还是可以compile/run?

Why can it still compile/run after changing locations of different parameters with different types?

昨晚调试了1个小时。我在写一个Huffman_coding的程序。我的部分错误代码是blow:

class HTree
{
public:
    HTree* left;
    HTree* right;
    int weight;
    char ch;

    HTree(){left = right = NULL; ch = '[=11=]'; 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。我一开始没有意识到这个小错误。输出当然是错误的。

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

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

好吧,我再说清楚一点,我的主要问题不是能不能自动对话,而是为什么我的回答是错误的 如果反过来可以自动发生。

错误的输出:

正确的输出:

提前致谢!

是的,存在从 charint 以及从 intchar 的隐式转换。

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

这是错误的,因为您使用某个 i 值初始化每个 HTree 对象而不是频率。并且 c 成员被频繁初始化。所以因为转换你的代码会编译和工作,并一直产生错误的结果。