数组结束读取;C++没有强制要求的操作(它是未定义行为)。 P> > C++抽象机,包含未定义行为的程序可以绝对执行任何事情,强>即使在程序执行之前遇到未定义的行为>。在您的特定情况下,程序通过不打印任何东西来显示这种行为。(即使您已向操作员,c++,eclipse-cdt,C++,Eclipse Cdt" /> 数组结束读取;C++没有强制要求的操作(它是未定义行为)。 P> > C++抽象机,包含未定义行为的程序可以绝对执行任何事情,强>即使在程序执行之前遇到未定义的行为>。在您的特定情况下,程序通过不打印任何东西来显示这种行为。(即使您已向操作员,c++,eclipse-cdt,C++,Eclipse Cdt" />

C++;数组迭代 P>可以找到为什么没有用C++代码在控制台上打印的原因吗?p> string array[] = { "a", "b", "c", "d" }; int length = sizeof(array); try { for (int i = 0; i < length; i++) { if (array[i] != "") cout << array[i]; } } catch (exception &e) { e.what(); } 字符串数组[]={“a”、“b”、“c”、“d”}; int length=sizeof(数组); 尝试 { for(int i=0;i >数组结束读取;C++没有强制要求的操作(它是未定义行为)。 P> > C++抽象机,包含未定义行为的程序可以绝对执行任何事情,强>即使在程序执行之前遇到未定义的行为>。在您的特定情况下,程序通过不打印任何东西来显示这种行为。(即使您已向操作员

C++;数组迭代 P>可以找到为什么没有用C++代码在控制台上打印的原因吗?p> string array[] = { "a", "b", "c", "d" }; int length = sizeof(array); try { for (int i = 0; i < length; i++) { if (array[i] != "") cout << array[i]; } } catch (exception &e) { e.what(); } 字符串数组[]={“a”、“b”、“c”、“d”}; int length=sizeof(数组); 尝试 { for(int i=0;i >数组结束读取;C++没有强制要求的操作(它是未定义行为)。 P> > C++抽象机,包含未定义行为的程序可以绝对执行任何事情,强>即使在程序执行之前遇到未定义的行为>。在您的特定情况下,程序通过不打印任何东西来显示这种行为。(即使您已向操作员,c++,eclipse-cdt,C++,Eclipse Cdt,行结束字符 正如Dave所提到的,sizeof不是数组的长度无行尾字符 正如Dave所提到的,sizeof不是数组的长度您使用了错误的长度: int length = sizeof(array)/sizeof(array[0]) 您在控制台上看不到任何内容的实际原因是,输出已缓冲,并且由于您尚未写入换行符,因此不会刷新。与此同时,您的应用程序崩溃。您使用了错误的长度: int length = sizeof(array)/sizeof(array[0]) 你在控制台上看不到任何东西的实际原因

行结束字符


正如Dave所提到的,sizeof不是数组的长度

无行尾字符


正如Dave所提到的,sizeof不是数组的长度

您使用了错误的长度:

int length = sizeof(array)/sizeof(array[0])

您在控制台上看不到任何内容的实际原因是,输出已缓冲,并且由于您尚未写入换行符,因此不会刷新。与此同时,您的应用程序崩溃。

您使用了错误的长度:

int length = sizeof(array)/sizeof(array[0])

你在控制台上看不到任何东西的实际原因是因为输出是缓冲的,而且因为你没有写换行符,所以它没有刷新。同时你的应用程序崩溃。

这个答案假设
string
=
std::string

设T为任意类型,n为任意正整数-则:

sizeof(T[n]) == n * sizeof(T)
也就是说-
sizeof(array)
不是数组的长度,而是数组使用的内存总量(在
char
s中)。您的
std::string
实现很可能使用了超过1个
char
的内存来存储其结构。这导致
length
的值远远大于4

这导致程序从过去的“代码> >数组结束读取;C++没有强制要求的操作(它是未定义行为)。


<> P> > C++抽象机,包含未定义行为的程序可以绝对执行任何事情,<>强>即使在程序执行之前遇到未定义的行为>。在您的特定情况下,程序通过不打印任何东西来显示这种行为。(即使您已向
操作员打了4个定义明确的电话,但此答案假定
字符串
==
std::string

设T为任意类型,n为任意正整数-则:

sizeof(T[n]) == n * sizeof(T)
也就是说-
sizeof(array)
不是数组的长度,而是数组使用的内存总量(在
char
s中)。您的
std::string
实现很可能使用了超过1个
char
的内存来存储其结构。这导致
length
的值远远大于4

这导致程序从过去的“代码> >数组结束读取;C++没有强制要求的操作(它是未定义行为)。


<> P> > C++抽象机,包含未定义行为的程序可以绝对执行任何事情,<>强>即使在程序执行之前遇到未定义的行为>。在您的特定情况下,程序通过不打印任何东西来显示这种行为。(尽管您已经对
操作符进行了4次定义良好的调用,
sizeof(array)
返回数组中的字节数,而不是数组中的元素数;因此这不会像您认为的那样…在您的情况下,
字符串是什么?另一个注意事项是,try…catch…的作用是什么?除了UB之外,该循环中没有可以抛出的操作(除非有人弄乱了cout的ios::exceptions标志)。此外,
e.what()
表达式可以合理地预期没有副作用(它对任何标准异常都没有副作用),那么它自己作为一个完整的语句在那里做什么呢?try/catch已删除。感谢大家将代码指向正确的原因。另外,
sizeof(array)
返回数组中的字节数,而不是数组中的元素数;因此这不会像您认为的那样…在您的情况下,
字符串是什么?另一个注意事项是,try…catch…的作用是什么?除了UB之外,该循环中没有可以抛出的操作(除非有人弄乱了cout的ios::exceptions标志)。此外,
e.what()
表达式可以合理地预期没有副作用(它对任何标准异常都没有副作用),那么它自己作为一个完整的语句在那里做什么呢?try/catch已删除。感谢大家将代码指向正确的原因。行尾与任何事情都有什么关系?@Armen Tsirunyan:他说的是endl。endl刷新缓冲区并打印新行字符。@Steven行尾字符不会导致输出ut将被释放。这在刷新缓冲区时发生。
行尾与任何事情都有关系吗?@Armen Tsirunyan:他说的是endl。endl将刷新缓冲区并打印新行字符。@Steven行尾字符不会导致输出被释放。这在刷新缓冲区时发生。
cout问题是为什么没有打印,而不是为什么他的for循环没有正确循环。进一步的sizeof(std::string)应该是16(VC,其他编译器将有不同的值),这足以循环它的数组长度,并应通过异常结束,因为超出了bounds@StevenC++中的超出界限是未定义的行为。不应该抛出异常。问题是为什么没有打印,而不是为什么for for循环没有正确地循环。应该是16(VC,其他编译器将有不同的值),这足以循环数组的长度,并且应该在最后通过异常,因为超出了bounds@Steven在C++中的越界是未定义的行为。不应该抛出异常。