繁体   English   中英

比较有符号和无符号整数

[英]comparing signed to unsigned int

我写了以下几行代码:

int pos = 0, last_pos = 0;
while ((pos = str.find_first_of(" ", last_pos)) != string::npos)

但是编译器显示错误:

error: comparison between signed and unsigned integer expressions [-Werror=sign-compare]
     while ((pos = str.find_first_of(" ", last_pos)) != string::npos)
                                                                            ^

我该如何解决? 这是我第一次看到这个

看起来有人提高了您工具的警告级别,并将警告变成了严重的编译停止错误。 大多数时候这是一件好事,尤其是在学习时,因为您不能再忽略编译器警告1

string方法返回的 position 和大小信息都是无符号的。 毕竟,负长度的字符串有什么用? 如果您查看find_first_of的文档,您会发现它没有返回int 它返回size_type 再仔细研究一下,您会发现size_type是一个无符号 integer ,由您的开发工具的库实现定义的一种或另一种类型。 如果你 go 挖掘标准库的实现头文件,你会发现size_type表示的实际类型,但你不需要知道确切的类型。 只需使用size_type并让编译器找出细节。

所以...

int pos = 0, last_pos = 0;
while ((pos = right_token.find_first_of(" ", last_pos)) != string::npos)

应该

string::size_type pos = 0, last_pos = 0;
while ((pos = right_token.find_first_of(" ", last_pos)) != string::npos)

1编译器错误是无效的语法,错误的语法,使您的源代码无法被翻译成可执行代码。 编译器警告是语法正确的代码,但编译器担心可能存在有问题的逻辑,并且程序不会像您预期的那样运行。 通常这是正确的,调查警告将节省您在运行时调试错误的时间。 但有时它会警告您不太可能遇到的事情。 在这种特殊情况下,您需要有一个巨大的字符串,可能是千兆字节长,以显示逻辑错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM