C++中用箭头运算符获取数组长度无输出,循环却正常终止?
核心误解:箭头运算符->在这里的作用
数组名cars在表达式中会自动退化为指向数组第一个元素的指针,所以cars->length()等价于(*cars).length()——也就是调用数组第一个string元素(cars[0],值为"Corvette")的length()方法,返回的是这个字符串的长度(8),完全不是数组的元素个数。这是你所有困惑的根源。
为什么循环看起来“正常终止”?
你的循环条件是i < cars->length(),也就是i < 8,但你的数组只有3个元素。当i >=3时,cars[i]属于数组越界访问,这是C++中的未定义行为——你的程序运行时没崩溃只是巧合,越界访问的内存区域可能刚好没有触发错误,但这种写法绝对错误,随时可能导致程序崩溃或输出乱码。
关于cars->length()输出为空的疑问
理论上cars->length()返回的是size_t类型的数字8,cout应该输出8。如果你的运行结果为空,大概率是运行环境异常或者你看错了输出。你可以单独打印cars[0].length(),结果会和cars->length()完全一致。
正确的数组遍历写法
要获取静态数组的元素个数,正确的方式是sizeof(cars)/sizeof(cars[0]),C++11及以后也可以用std::size(cars)(需要包含<iterator>头文件)。修改后的循环如下:
for (int i = 0; i < sizeof(cars)/sizeof(cars[0]); i++) { cout << cars[i] << '\n'; }
额外的逗号运算符问题
你代码里的cars[1] = "Camaro", "Ford";是逗号运算符的误用:逗号运算符会依次执行左右表达式,但这里只有cars[1] = "Camaro"生效,后面的"Ford"没有任何作用。如果想给cars[1]赋值为"Ford",直接写cars[1] = "Ford";即可。
内容的提问来源于stack exchange,提问作者Christian Cangelli

