2015-04-17 55 views
4

我目前的项目太长而无法在这里发布,但是,这是产生真正奇怪行为的单行,至少在我看来是这样。我使用clip对象来存储相对较短的字符串(35中使用的最大字符数),但是在处理start中的负值时,条件失败。如果通过值失败进行比较测试(C++)

我试图在clip.length()前面添加(const int),但输出不会改变:

任何想法,这是什么意思?我在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

+0

添加一个'(const int)'应该可以解决这个问题。缺少http://stackoverflow.com/help/mcve,我们无法帮到你。 –

+0

为什么downvote?请随意建议我如何改进我的帖子,谢谢。 – user43389

+0

您的编译器是否提醒您比较有符号和无符号整数?您需要启用更多警告。 – molbdnilo

回答

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

+0

我对编程颇为陌生,我一直在公然避免警告,说实话,但是现在我找到了3个小时左右的bug,因为我没有启用警告。 – user43389

+0

这是更深的答案。如果编译器警告已被打开,OP甚至可能在发布之前发现错误。 – Carlton

12

很可能length()回报unsigned int,所以另一种说法,signed int,被转换为无符号一样,那么比较发生。

它是所谓的通常算术转换的一部分。看到标准:

表达式[EXPR]

....

否则,如果具有无符号整数类型的操作数的秩大于或等于所述的 秩另一个操作数的类型,带符号整数类型的操作数应转换为无符号整数类型操作数的类型 。

+0

解决了它,最终,谢谢你的失踪! – user43389

+1

@ user43389如果你喜欢这个答案,你为什么不接受它? – refi64