如何在C ++ 14中处理此特定代码

时间:2018-10-03 16:39:40

标签: c++

我知道代码中有错误,但是我很想知道C ++ 14如何处理代码以输出此错误

3
þÿÿt

使用此代码

#include <iostream>

void pretty_print(int,int,int);

int main()
{
    srand(time(0));
    const int LIM = 100;
    int a = rand()%LIM;
    int b = rand()%LIM;
    int c = rand()%LIM;
    if(a+b+c<500)
    {
        pretty_print(a,b,c);
    }
    else throw new std::invalid_argument("FOOBAR");
    return 0;
}

void pretty_print(int a, int b,int c)
{
    std::string ans = "";
    int count = 0;
    if(a!=0)
    {
        count++;
        ans+=(a+" ");
    }
    if(b!=0)
    {
        count++;
        ans+=(b+" ");
    }
    if(c!=0)
    {
        count++;
        ans+=(c+" ");
    }
    std::cout << count << "\n";
    std::cout << ans << "\n";
}

P.S。我故意尝试在不进行转换的情况下将一个整数添加到字符串中,以检查输出为何如此。我想知道为什么将不转换的整数添加到字符串会导致这种行为。

2 个答案:

答案 0 :(得分:3)

  

我想知道为什么将不转换的整数添加到字符串会导致这种行为。

字符串文字是字符数组。在值上下文中(例如+的操作数),数组将转换为指向第一个元素的指针。这种隐式转换称为衰减

向指针(指向数组的元素)添加整数n将导致指向最初指向的元素的第n个连续同级指针。例如,"abcd" + 1将导致指向字符b的指针。这称为指针算术。

您生成的数字最多为100,因此最终将获得一个指针,该指针指向字符串文字的最大百分数。但是,字符串文字的长度仅为2(数组的长度除了字符串本身的长度外还包括空终止符),因此,除非您碰巧只生成零和一,否则这些指针将超出边界字符串文字。

将字符指针传递给std::string的复合赋值运算符时,该指针将被视为指向字符串的以空终止的指针,并且将访问该指向的对象。

访问数组的行为是不确定的。

答案 1 :(得分:3)

在C ++中,字符串文字如Welcome to the Greater S E A T T L E area实际上是一个常量字符数组。这样,它将衰减到指向其第一个元素的指针。

您使用Welcome to the Greater SEATTLE area所做的是指针算术:您将" "的值添加到指向a+" "的第一个字符的指针。换句话说,a等于" "。 (这有助于知道对于任何指针或数组a + " "和索引&" "[a],表达式p等于i。)

除非变量的值是*(p + i)(或p[i],即终止符的索引),否则作为索引的值将 way 超出范围包含0的数组中的第一个,导致到undefined behavior