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++中的越界是未定义的行为。不应该抛出异常。