qua*_*els 2 c++ for-loop clang c++11
我正在尝试使用基于for循环的新C++ 11范围.这是我的计划:
#include <iostream>
#include <string>
#include <sstream>
#include <fstream>
using namespace std;
ofstream logger("log.txt");
void log(string message)
{
logger << message << std::endl;
logger.flush();
}
int main( int argc, char* args[] )
{
log("hello world");
cout << "hello world\n";
log("declare sort me");
int sortMe[10];
log("loop sortMe");
for(int i : sortMe) {
log("in loop " + i);
sortMe[i] = i + 1;
}
}
Run Code Online (Sandbox Code Playgroud)
我正在使用clang ++进行编译.它汇编了警告:
clang++ -o mycpp mycpp.cpp
mycpp.cpp:24:12: warning: range-based for loop is a C++11 extension
[-Wc++11-extensions]
for(int i : sortMe) {
^
1 warning generated.
Run Code Online (Sandbox Code Playgroud)
当它运行时,我得到这个输出:
hello world
Segmentation fault (core dumped)
Run Code Online (Sandbox Code Playgroud)
根据log.txt文件,程序进入for循环,但它永远不会进入for循环.我错过了什么?
tem*_*def 10
这个循环:
for(int i : sortMe) {
log("in loop " + i);
sortMe[i] = i + 1;
}
Run Code Online (Sandbox Code Playgroud)
循环和返回值存储中sortMe阵列,而不是索引的的sortMe阵列.结果,查找sortMe[i]将跳转到数组的完全随机索引(可能方式,超出范围),导致段错误.
如果要将每个元素设置为等于其位置,只需使用普通的for循环:
for (int i = 0; i < 10; i++) {
sortMe[i] = i + 1;
}
Run Code Online (Sandbox Code Playgroud)
另外,正如@hmjd所指出的那样,调用log将无法正常工作,因为您正在对字符串执行指针运算,而不是进行字符串连接.
希望这可以帮助!
您正在使用基于范围的for循环,您应该使用标准for循环.在int i你的循环是不是当前元素的索引,但该元素的值.也就是说,如果您的数组包含{1, 3, 3, 7}的值i在每次迭代会1,然后3,然后3,然后7.由于您的数组未初始化,您不知道它的值是什么,i并且您将获得未定义的行为.
如果您想在for循环中使用索引,请使用标准for循环:
for(int i = 0; i < 10; i++) {
log("in loop " + std::to_string(i));
sortMe[i] = i + 1;
}
Run Code Online (Sandbox Code Playgroud)
请注意,要进行字符串连接+,您的一个操作数将需要为a std::string.否则,您将添加i指向第一个字符的指针"in loop ".
| 归档时间: |
|
| 查看次数: |
2975 次 |
| 最近记录: |