从字符串中减去整数
Int subtraction from a string
为什么下面的代码没有给出数组超出范围的错误?
#include <iostream>
int main() {
std::cout << "Hello, world!" - 50;
return 0;
}
Why the code below does not give the error that array is out of range?
因为 "Hello, world!"
是 const char[14]
类型的 string literal,由于 类型衰减.
因此,您实际上是从生成的(衰减的)指针中减去 50
。当 operator<<
取消引用此指针时,将导致 未定义的行为 。
请注意,未定义的行为意味着任何事情都可能发生,包括但不限于提供预期输出的程序。但是从不依赖 具有 UB 的程序的输出。程序可能会崩溃
它不会给出错误,因为确保遵守数组边界是您的工作。与许多其他事情一样,这不可能总是被检测到,因此用户是否可以不这样做取决于它。
不过,编译器在警告方面做得更好了:
<source>:4:36: warning: offset '-50' outside bounds of constant string [-Warray-bounds]
<source>:5:36: warning: array subscript 50 is outside array bounds of 'const char [14]' [-Warray-bounds]
gcc 和 clang 可以很好地检测常量字符串的不足和溢出。
为什么下面的代码没有给出数组超出范围的错误?
#include <iostream>
int main() {
std::cout << "Hello, world!" - 50;
return 0;
}
Why the code below does not give the error that array is out of range?
因为 "Hello, world!"
是 const char[14]
类型的 string literal,由于 类型衰减.
因此,您实际上是从生成的(衰减的)指针中减去 50
。当 operator<<
取消引用此指针时,将导致 未定义的行为 。
请注意,未定义的行为意味着任何事情都可能发生,包括但不限于提供预期输出的程序。但是从不依赖 具有 UB 的程序的输出。程序可能会崩溃
它不会给出错误,因为确保遵守数组边界是您的工作。与许多其他事情一样,这不可能总是被检测到,因此用户是否可以不这样做取决于它。
不过,编译器在警告方面做得更好了:
<source>:4:36: warning: offset '-50' outside bounds of constant string [-Warray-bounds]
<source>:5:36: warning: array subscript 50 is outside array bounds of 'const char [14]' [-Warray-bounds]
gcc 和 clang 可以很好地检测常量字符串的不足和溢出。