C++ 有两种不同属性的字符串:
C 字符串和字符串文字
它们是固定大小的空终止字符数组(最大大小在编译时确定)。 "abc" 称为string literal,您可以将其视为包含{ 'a', 'b', 'c', '\0' } 的字符数组。您的 range-based for loop 正在遍历数组中的 所有 个字符,包括空终止符。在没有空终止的情况下打印数据的 C 方式是:
char ca[] = "abc";
char *c = ca;
while (*c)
std::cout << (int) *(c++) << " ";
请注意,不建议使用这种老式的原始指针摆弄方式 - 这太容易自取其辱。
C++ 字符串和 C++ 字符串文字
std::string 提供了一个字符串实现,可以处理任意长度的字符串(内存在运行时动态分配)。 C++ 字符串是具有自己的处理长度方式的对象,不需要空终止。 std::string 类提供了迭代器,使我们能够编写类似的循环
std::string s = "abc";
// Traditional loop with iterators:
for (auto i = s.begin(); i != s.end(); i++)
std::cout << (int) *i << " ";
// Range-based for loop:
for (char c : s)
std::cout << (int) c << " ";
C 字符串"abc" 被传递给std::string 的构造函数,该构造函数以其内部格式存储它。
请注意,C++14 也支持C++ string literals:"abc"s(注意末尾的运算符s)。在您的示例中,您可以像这样使用它们:
using namespace std::string_literals;
for (char c : "abc"s)
std::cout << (int) c << " ";
}