What's the behaviour of “” + number and why c++ compile it?

后端 未结 2 1300
温柔的废话
温柔的废话 2021-01-25 02:48

In the code below i successfully compile it but i can\'t understand why for certain values of number the program crash and for other values it\'s not. Could someone explain the

2条回答
  •  孤独总比滥情好
    2021-01-25 03:26

    In C++, "" is a const char[1] array, which decays into a const char* pointer to the first element of the array (in this case, the string literal's '\0' nul terminator).

    Adding an integer to a pointer performs pointer arithmetic, which will advance the memory address in the pointer by the specified number of elements of the type the pointer is declared as (in this case, char).

    So, in your example, ... << ("" + number) << ... is equivalent to ... << &""[number] << ..., or more generically:

    const char *ptr = &""[0];
    ptr = reinterpret_cast(
        reinterpret_cast(ptr)
        + (number * sizeof(char))
    );
    ... << ptr << ...
    

    Which means you are going out of bounds of the array when number is any value other than 0, thus your code has undefined behavior and anything could happen when operator<< tries to dereference the invalid pointer you give it.

    Unlike in many scripting languages, ("" + number) is not the correct way to convert an integer to a string in C++. You need to use an explicit conversion function instead, such as std::to_string(), eg:

    #include 
    #include 
    
    int main()
    {
        long int number = 255;
        std::cout << "Value 1 : " << std::flush << std::to_string(number) << std::flush << std::endl;
        number = 15155;
        std::cout << "Value 2 : " << std::flush << std::to_string(number) << std::flush << std::endl;
        return 0;
    }
    

    Or, you can simply let std::ostream::operator<< handle that conversion for you, eg:

    #include 
    
    int main()
    {
        long int number = 255;
        std::cout<< "Value 1 : " << std::flush << number << std::flush << std::endl;
        number = 15155;
        std::cout<< "Value 2 : " << std::flush << number << std::flush << std::endl;
        return 0;
    }
    

提交回复
热议问题