我目前的项目太长了,不能在这里发布,但是,这是产生一种非常奇怪的行为的单行,至少在我看来。我使用clip
对象来存储相对较短的字符串(35中使用的最大大小),但在处理start
中的负值时条件失败。
我尝试在(const int)
前添加clip.length()
,但输出不会改变:
任何想法是什么意思?我在Ubuntu 14.04上使用G ++。
void Cut ( const int start, const int stop )
{ if (start > clip.length() ) cout << "start: " << start << " > " << clip.length() << endl;
...
}
答案 0 :(得分:12)
length()
可能会返回unsigned int
,因此另一个参数signed int
也会转换为无符号,然后进行比较。
这是所谓的通常的算术转换的一部分。见标准:
表达式[expr]
...
否则,如果具有无符号整数类型的操作数的等级大于或等于 另一个操作数的类型的等级,带有符号整数类型的操作数应转换为 具有无符号整数类型的操作数的类型。
答案 1 :(得分:4)
原因是这种比较:
if (start > clip.length()) {
您正在比较已签名和未签名的人。我建议将两个操作数改为具有相同的类型,例如:
if (start > static_cast<int>(clip.length())) {
此外,原始代码会在警告打开时生成一个很好的编译器警告(并且应该打开以避免此类问题):
test.cpp:8:13: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
使用g ++,请尝试使用-Wall
甚至-Wextra
。