比较有符号和无符号整数

0 c++

我写了以下几行代码:

int pos = 0, last_pos = 0;
while ((pos = str.find_first_of(" ", last_pos)) != string::npos)
Run Code Online (Sandbox Code Playgroud)

但是编译器显示错误:

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

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

use*_*301 5

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

string方法返回的位置和大小信息都是无符号的。毕竟,负长度的字符串有什么用?如果您查看文档,find_first_of您会发现它不会返回int;它返回size_type。随着各地多一点戳,你会发现size_type是一种或另一种通过开发工具的库实现定义的无符号整数。如果您深入研究标准库的实现标头,您会发现由 表示的实际类型size_type,但您不需要知道确切的类型。只需使用size_type并让编译器弄清楚细节。

所以...

int pos = 0, last_pos = 0;
while ((pos = right_token.find_first_of(" ", last_pos)) != string::npos)
Run Code Online (Sandbox Code Playgroud)

应该

string::size_type pos = 0, last_pos = 0;
while ((pos = right_token.find_first_of(" ", last_pos)) != string::npos)
Run Code Online (Sandbox Code Playgroud)

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