[英]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.