C ++ static_cast< int> (str.size() - 1)是什么意思?

时间:2017-07-26 05:31:38

标签: c++ casting

我在使用这条线时陷入困境而无法理解。

任何人都可以告诉我

的含义是什么
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;
}

3 个答案:

答案 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)

如果您比较签名无符号整数,编译器会警告您。例如。 会显示以下警告消息:

  

警告:有符号和无符号整数表达式之间的比较   [-Wsign-比较]

std::string::size返回无符号整数std::size_t是实现定义类型,可以存储理论上可能的对象的最大大小任何类型

如果要取消这些警告,则必须在比较之前将有符号整数强制转换为无符号。您提问的代码片段恰恰相反:将std::size_t(无符号)类型转换为int(带有str.size() - 1(签名)类型。 这是一种不好的做法,因为如果Bad credentials高于static_cast,则会产生实现定义的行为。

答案 2 :(得分:0)

它做什么?

它需要str的大小,并从中减去1。然后,它将结果数转换为int。然后它将此数字与i进行比较。

为什么会转换它?如果没有这样做,则将无符号数与已签名数进行比较。标准中有针对此案例的规则,但它们很复杂,并且取决于sizeofint的{​​{1}}。你最好不要将签名号码与未签名号码进行比较。编译器通常会向您发出警告。

怎么会有问题?考虑一下,如果size_t返回0,那么,对它应用-1,它就变成了一个巨大的数字SIZE_MAX。所以这个循环不会按预期工作(它会循环很多次而不是完全跳过循环,所以它会崩溃),如果演员阵容不在那里。

请注意,此代码存在使用str.size()的潜在错误。这是因为,如果int包含一个不适合str.size()的数字,该程序将会出错。它应该int使用size_t,而使用i代替。

对我而言,对while (i+1<str.size())方法使用无符号数的决定是标准库的设计错误之一(我知道很多人都有不同的看法,但这是我的看法)。