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

C++ 在C+;中如何处理此特定代码+;14,c++,C++,我知道代码中有一个bug,但我想知道C++14是如何处理代码以输出这个bug的 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

我知道代码中有一个bug,但我想知道C++14是如何处理代码以输出这个bug的

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";
}
#包括
无效打印(int,int,int);
int main()
{
srand(时间(0));
常数int LIM=100;
int a=rand()%LIM;
int b=rand()%LIM;
int c=rand()%LIM;
如果(a+b+c)
我想知道为什么在不转换字符串的情况下添加整数会导致这种行为

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

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

您最多生成100个数字,因此最终会得到一个指向字符串文本第一百个索引的指针。但是,字符串文本的长度只有2(数组的长度除了字符串本身的长度外,还包括null终止符),因此,除非您碰巧只生成0和1,否则这些指针将超出字符串文本的边界

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


超出数组的访问行为是未定义的。

在C++中,一个字符串文字,例如“代码>”“<代码> >实际上是一个常量字符数组。这样,它将衰减到指向它的第一个元素的指针。

使用
a+”
所做的是指针算法:将
a
的值添加到指向
的第一个字符的指针上。换句话说,
a+”
等于
和“[a]
”。(这有助于了解,对于任何指针或数组
p
和索引
i
,表达式
*(p+i)
完全等于
p[i]


除非变量的值是
0
(或
1
,这是终止符的索引),否则作为索引的值将远远超出包含
的数组的范围,导致与你的问题无关的.< /p>,但请阅读我重新编辑了代码以符合核心C++编程实践。输出仍然是相同的,你可能想要<代码> ANS+= STD::toStand(c)+”。;
,它使用
std::string
的附加运算符而不是指针算术。请参见
std::ostringstream
“[1]
也可以很好地定义。