我在使用这条线时陷入困境而无法理解。
任何人都可以告诉我
的含义是什么while(i < static_cast<int>(str.size() - 1))
以下代码?
#include <iostream>
using namespace std;
int main() {
string str;
cin >> str;
int i = 0;
while(i < static_cast<int>(str.size() - 1)) {
if(i > -1 && str[i] == str[i + 1]) {
str.erase(i,2);
i--;
}
else {
i++;
}
}
if(str.empty())
cout << "Empty String" << endl;
else
cout << str << endl;
return 0;
}
答案 0 :(得分:0)
str.size()
:取字符串的大小。返回类型是size_t
str.size()-1
:取大小减去1. still size_t
static_cast< int > (str.size()-1)
:将size_t强制转换为int。所以如果sizeof(size_t) > sizeof(int)
修剪溢出二进制数字,或者如果sizeof(size_t) < sizeof(int)
则修剪左边的零,并将其视为有符号整数而不是无符号。
答案 1 :(得分:0)
如果您比较签名和无符号整数,编译器会警告您。例如。 gcc会显示以下警告消息:
警告:有符号和无符号整数表达式之间的比较 [-Wsign-比较]
std::string::size
返回无符号整数,std::size_t
是实现定义类型,可以存储理论上可能的对象的最大大小任何类型。
如果要取消这些警告,则必须在比较之前将有符号整数强制转换为无符号。您提问的代码片段恰恰相反:将std::size_t
(无符号)类型转换为int
(带有str.size() - 1
(签名)类型。 这是一种不好的做法,因为如果Bad credentials
高于static_cast
,则会产生实现定义的行为。
答案 2 :(得分:0)
它做什么?
它需要str
的大小,并从中减去1。然后,它将结果数转换为int
。然后它将此数字与i
进行比较。
为什么会转换它?如果没有这样做,则将无符号数与已签名数进行比较。标准中有针对此案例的规则,但它们很复杂,并且取决于sizeof
和int
的{{1}}。你最好不要将签名号码与未签名号码进行比较。编译器通常会向您发出警告。
怎么会有问题?考虑一下,如果size_t
返回0,那么,对它应用-1,它就变成了一个巨大的数字SIZE_MAX。所以这个循环不会按预期工作(它会循环很多次而不是完全跳过循环,所以它会崩溃),如果演员阵容不在那里。
请注意,此代码存在使用str.size()
的潜在错误。这是因为,如果int
包含一个不适合str.size()
的数字,该程序将会出错。它应该int
使用size_t
,而使用i
代替。
对我而言,对while (i+1<str.size())
方法使用无符号数的决定是标准库的设计错误之一(我知道很多人都有不同的看法,但这是我的看法)。