IF价值失败的比较测试(C ++)

时间:2015-04-17 23:03:06

标签: c++ object

我目前的项目太长了,不能在这里发布,但是,这是产生一种非常奇怪的行为的单行,至少在我看来。我使用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;

  ...
 }

enter image description here

2 个答案:

答案 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