为什么不同类型的不同参数换位置后还是可以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 w
和frequency[i], (char)i
。我一开始没有意识到这个小错误。输出当然是错误的。
但是我的问题是,为什么还能编译呢?或者为什么它仍然可以 运行?因为 answer/cout 是完全错误的。而且根据不同的类型,我认为它不能编译成功- char != int
,对吗?
谁能告诉我为什么会这样?它会自动将int
转换为char
和char
转换为int
,然后它可以编译和运行,并得到错误的答案吗?
好吧,我再说清楚一点,我的主要问题不是能不能自动对话,而是为什么我的回答是错误的 如果反过来可以自动发生。
错误的输出:
正确的输出:
提前致谢!
是的,存在从 char
到 int
以及从 int
到 char
的隐式转换。
C++ 可以使用隐式转换将 chars(8 位整数)转换为 int,如果目标类型比源类型宽,这里就是这种情况(int 通常是 16 位或 32 位宽,具体取决于平台,字符为 8 位)。
将 int 赋给 char 时,编译器通常会打印一条警告消息(但赋值会起作用)。
这是错误的,因为您使用某个 i
值初始化每个 HTree 对象而不是频率。并且 c
成员被频繁初始化。所以因为转换你的代码会编译和工作,并一直产生错误的结果。
昨晚调试了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 w
和frequency[i], (char)i
。我一开始没有意识到这个小错误。输出当然是错误的。
但是我的问题是,为什么还能编译呢?或者为什么它仍然可以 运行?因为 answer/cout 是完全错误的。而且根据不同的类型,我认为它不能编译成功- char != int
,对吗?
谁能告诉我为什么会这样?它会自动将int
转换为char
和char
转换为int
,然后它可以编译和运行,并得到错误的答案吗?
好吧,我再说清楚一点,我的主要问题不是能不能自动对话,而是为什么我的回答是错误的 如果反过来可以自动发生。
错误的输出:
正确的输出:
提前致谢!
是的,存在从 char
到 int
以及从 int
到 char
的隐式转换。
C++ 可以使用隐式转换将 chars(8 位整数)转换为 int,如果目标类型比源类型宽,这里就是这种情况(int 通常是 16 位或 32 位宽,具体取决于平台,字符为 8 位)。 将 int 赋给 char 时,编译器通常会打印一条警告消息(但赋值会起作用)。
这是错误的,因为您使用某个 i
值初始化每个 HTree 对象而不是频率。并且 c
成员被频繁初始化。所以因为转换你的代码会编译和工作,并一直产生错误的结果。