我知道代码中有错误,但是我很想知道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。我故意尝试在不进行转换的情况下将一个整数添加到字符串中,以检查输出为何如此。我想知道为什么将不转换的整数添加到字符串会导致这种行为。
答案 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。