【发布时间】:2021-01-21 12:38:16
【问题描述】:
首先让我说:很抱歉,如果这被解释了,我尝试阅读它并寻找答案,但我没有找到回答这个特定问题的答案。
所以我正在用 C++ 编写初学者级别的代码,并且我编写了一个非常简单的函数,它返回下一个找到的非空格字符的索引。它的灵感来自方法 string.find()。 如果该函数没有找到任何内容,则返回 string::npos。
int findChar (const string &line, const int startPos){
for (unsigned int i= startPos; i < line.length(); i++){
if ( line[i] != ' ') return i;
}
return string::npos;
}
现在,因为我正在处理字符串和索引,所以我想到了使用无符号整数。
unsigned int where;
where = findChar(line, 0);
因为“where”是一个无符号整数,我认为比较“where == string::npos”是个坏主意,因为 string::npos 是用 -1 初始化的,而 unsigned int 不能等于 - 1.但是如果函数没有找到任何东西并且它返回 string::npos 条件可以为真,程序会识别出“unsigned int where”是 string::npos,但是当我尝试打印“where”时,它会打印输出为 unsigned int 可以容纳的最大数字。
所以我的问题是,为什么或如何,程序可以识别 unsigned int 等于 string::npos,即使从技术上讲 string::npos 的值初始化为 -1。
我正在努力学习,所以如果你能指出一些可以回答这个问题的阅读材料,我将不胜感激。
【问题讨论】:
-
打印
std::string::npos,你会感到惊讶。请注意,您的代码仅在 32 位平台上“有效”,其中std::size_t的大小与unsigned int相同。 -
string::npos 被定义为
static const size_t npos = -1;但std::size_t is the unsigned integer type of the result of the sizeof operator所以当-1 被分配给一个size_t 对象时,它被转换为一个与-1 具有相同位模式的无符号值。跨度> -
那个函数
findChar很奇怪。它返回int,而i是unsigned int,std::string::npos是size_t。 -
@JerryJeremiah 位模式可能不同(在 64 位系统或非 2 的补码系统上)。转换是根据模运算下的值定义的
标签: c++