C++ 为什么是C++;工作(变量的声明/定义)

C++ 为什么是C++;工作(变量的声明/定义),c++,for-loop,variables,declaration,stdvector,C++,For Loop,Variables,Declaration,Stdvector,为什么我可以在for循环的每次迭代中在for循环[for(auto-vall:k0L){…}]中声明和定义3个变量?当我执行g++code.cpp时,编译器不会抱怨。 我知道一个变量只能声明一次。 我知道我写不出int a=5;INTA=6;在main()范围内。 然而,这就是我在for循环中所做的。 谢谢大家! #include <iostream> #include <vector> #include <fstream> #include <math

为什么我可以在for循环的每次迭代中在for循环[for(auto-vall:k0L){…}]中声明和定义3个变量?当我执行g++code.cpp时,编译器不会抱怨。 我知道一个变量只能声明一次。 我知道我写不出int a=5;INTA=6;在main()范围内。 然而,这就是我在for循环中所做的。 谢谢大家!

#include <iostream>
#include <vector>
#include <fstream>
#include <math.h>
#include <algorithm>

#define PI 3.14159265

std::vector<double> linspace (double start, double end, size_t points) { // will be used in main(), details of this function are not important.
    std::vector<double> res(points);
    double step = (end - start) / (points - 1);
    size_t i = 0;
    for (auto& e: res) {
        e = start + step * i++;
    }
    return res;
}

int main() {

    std::vector<double> k0L = linspace (0,20, 10000); // a linearly spaced vector with 10000 values between 0,20
    std::vector<double> f_ra; 

    **// QUESTION : Why can I declare and define tau, phi_of_tau, to_push_back, at each iteration of the following for-loop?** 
    for (auto vall: k0L) {
        double tau = pow(vall, (1./3.)) * sin(20.0*PI/180.0);  // something1
        double phi_of_tau = 2.1 * tau * exp(- (2./3.) * pow(tau,3) );  // something2
        double to_push_back = 0.5 * pow(phi_of_tau, 2); // something_total, composed of something1 and something2
        f_ra.push_back(to_push_back); // equivalent to instruction below
        // f_ra.push_back(0.5 * pow(2.1 * (pow(vall, (1./3.)) * sin(30.0*PI/180.0)) * exp(- (2./3.) * pow((pow(vall, (1./3.)) * sin(20.0*PI/180.0)),3)), 2));    
    }

    // Write values to a file
    std::ofstream myfile("fra_vs_k0L_30degrees.dat");
    for (auto i=0; i<= f_ra.size(); i++) {
        myfile << k0L[i] << " " << f_ra[i] << std::endl;
    }

return 0;
} // END main()
#包括
#包括
#包括
#包括
#包括
#定义PI 3.14159265
std::vector linspace(双起点、双终点、大小点){//将在main()中使用,此函数的详细信息并不重要。
std::向量res(点);
双步骤=(结束-开始)/(点-1);
尺寸i=0;
用于(自动和电气:分辨率){
e=开始+步骤*i++;
}
返回res;
}
int main(){
std::vector k0L=linspace(0,20,10000);//在0,20之间具有10000个值的线性间隔向量
std::向量f_-ra;
**//问题:为什么我可以在以下for循环的每次迭代中声明和定义tau,phi_of_tau,以将_向后推?**
用于(自动阀:k0L){
双tau=pow(vall,(1/3.)*sin(20.0*PI/180.0);//某物1
双φu of_tau=2.1*tau*exp(-2./3.)*pow(tau,3));//某物2
double to_push_back=0.5*pow(phi_of_tau,2);//总计某物,由某物1和某物2组成
f_ra.push_back(to_push_back);//相当于下面的指令
//反推力(0.5*pow(2.1*(pow(vall,(1/3.))*sin(30.0*PI/180.0))*exp(-(2/3.)*pow(pow(vall,(1/3.))*sin(20.0*PI/180.0)),2));
}
//将值写入文件
std::流myfile(“fra_vs_k0L_30degrees.dat”);

for(auto i=0;i这是由于作用域。所有这些变量仅在for循环中可用。 如果你有这个代码

if(真){
INTA=1;
}
//注意,此处未定义a,仅在if中定义
如果(真){
INTA=2;
}

它也不会抱怨。

这是由于作用域的原因。所有这些变量仅在for循环中可用。 如果你有这个代码

if(真){
INTA=1;
}
//注意,此处未定义a,仅在if中定义
如果(真){
INTA=2;
}

也不抱怨。

< p>因为C++中的作用域是如何工作的:这些变量的范围是循环的<>代码体。换句话说,它们是在每个循环迭代中创建的,并一直存活到相同迭代结束。

这完全等同于即使多次调用函数,也可以在函数中声明局部变量:

int f(int x) {
    int a = x * 2;
    return a;
}

int main() {
    f(2);
    f(2);
}

这当然不会让你吃惊,你不认为代码< >代码> >代码> f>代码>是什么重新定义的?

< p>因为C++中的作用域是如何工作的:这些变量的范围是循环的<>代码体。换句话说,它们是在每个循环迭代中创建的,并一直存活到相同的迭代结束。/p> 这完全等同于即使多次调用函数,也可以在函数中声明局部变量:

int f(int x) {
    int a = x * 2;
    return a;
}

int main() {
    f(2);
    f(2);
}

当然这并不让你感到惊讶,你也不认为
a
内部
f
被重新定义了吗?

虽然与for循环语法相关的其他答案是正确的,但我认为OP是在问C++11基于范围的for循环语法,这让他/她感到担忧

这是(自动a:容器){…}的
是C++11基于循环语法的范围,它用于迭代
容器
数据结构,每一步都引用
a
,关键字
auto
意味着
a
的类型将与
容器
对象的类型无关


更多细节可以在这里找到:

虽然其他与for循环语法相关的答案是正确的,但我认为OP是在询问C++11基于范围的for循环语法,这让他/她感到担忧

这是(自动a:容器){…}的
是C++11基于循环语法的范围,它用于迭代
容器
数据结构,每一步都引用
a
,关键字
auto
意味着
a
的类型将与
容器
对象的类型无关


可以在此处找到更多详细信息:

C++允许您在循环中声明/定义变量。变量的内存在循环开始时分配一次,因为这些变量是在循环中声明的,所以它们的范围限制在该循环中

这可能是一个很好的实践,因为限制变量的范围通常是正确的调用,并且有利于调试。但是应该注意的是,变量不应该在循环之间保留它们的值,在您的特定示例中,它们的值每次都会重新初始化。因为您有一些相当复杂的数学问题若要初始化这些变量,这可能会对性能造成有意义的消耗,因为这些计算是为了初始化每个循环的变量。由于这些变量似乎具有常量值,因此在您的情况下,最好在循环范围之外定义变量,以便只完成一次计算。H这很有帮助

以下几页也很好地解决了这个问题:)


C++允许您在循环中声明/定义变量。变量的内存在循环开始时分配一次,因为这些变量是在循环中声明的,所以它们的范围限制在该循环中

这可能是一个很好的实践,因为限制变量的范围通常是正确的调用,并且有利于调试。但是应该注意的是,变量不应该在循环之间保留它们的值,在您的特定示例中,它们的值每次都会重新初始化。因为您有一些相当复杂的数学问题要初始化这些v