C++之const的进化

C语言中的const
--const修饰的变量是只读的,本质还是变量。
--const修饰的局部变量是在栈上分配空间。
--const修饰的全局变量在只读存储区分配空间。
--const只在编译期有用,在运行期无用。
--const修饰的变量不是真的常量,它只是告诉编译器变量不能出现在赋值符号的左边。
--C语言中的const使得变量具有只读属性
--const将具有全局生命周期的变量存储于只读存储区
--const不能定义真正意义上的常量!
#include <stdio.h>
int main()
{
    const int c = 0;
    int* p = (int*)&c;
    printf("Begin...\n");
    *p = 5;
    printf("c = %d\n", c);  // 可以通过指针来修改const int修改的变量c的值。说明本质还是变量。gcc编译运行后结果 c = 5;而g++编译运行后结果 c = 0
    printf("*p = %d\n", *p);  // 结果为 5
    printf("End...\n");
    return 0;
}
C++中的const
--C++在C的基础上对const进行了进化处理。
--当碰见const声明时在符号表中放入常量。
--编译过程中若发现使用常量则直接以符号表中的值替换。
编译过程中若发现下述情况则给对应的常量分配存储空间。
1、对const常量使用了extern2、对const常量使用&操作符。

注意:
C++编译器虽然可能为const常量分配空间,但不会使用其存储空间中的值。
C语言中的const变量是只读变量,会分配存储空间。

C++中的const常量在下面的两种情况下分配存储空间:
--当const常量为全局,并且需要在其它文件中使用,即使用了extern修饰。
--当使用&操作符对const常量取地址。

C++中的const常量类似于宏定义 const int c = 5;相当于#define c 5。
C++中的const常量与宏定义有以下不同:
--const常量是由编译器处理,而不是预处理器处理的。
--编译器对const常量进行类型检查和作用域检查,宏没办法做这些检查的。
--宏定义由预处理器处理,单纯的文本替换而已。
#include <stdio.h>
void f()
{
    #define a 3
    const int b = 4;
}
void g()
{
    printf("a = %d\n", a);  // 这里的a是在f()里面被定义的,为什么不报错?因为宏是在预处理器处理的,宏没有作用域限制的。
    printf("b = %d\n", b); // 这里编译时会报错,因为const修饰的变量是有作用域限制的。这两行说明了const与宏的区别。
}
int main()
{
    const int A = 1;
    const int B = 2;
    int array[A + B] = {0};  
    // 用gcc编译后,这里报错误,两个变量A + B的结果需要程序运行的时候才得到,所以这里报错。
    // 用g++编译就能通过,因为在g++中把A和B当成真正的常量了。
    int i = 0;
    for(i=0; i<(A + B); i++)
    {
        printf("array[%d] = %d\n", i, array[i]);
    } 
    f();
    g();
    return 0;
}
总结:
C++中的const有以下几个特点
--C++中的const不是只读变量。
--C++中的const是一个真正意义上的常量。
--C++编译器可能会为const常量分配空间。
--C++完全兼容C语言中const常量的语法特性。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
差分进化算法(Differential Evolution,DE)是一种常用的全局优化算法,具有收敛速度快、易于实现、不需要梯度信息等优点。本文将介绍差分进化算法的原理以及C++实现。 1. 差分进化算法原理 差分进化算法是一种基于群体智能的优化算法,其基本思想是通过个体之间的交叉和变异来生成新的个体,并通过适应度函数的评价来选择优良个体,不断迭代,直到满足终止条件为止。其基本流程如下: 1.1 初始化 设群体大小为N,每个个体有n个维度,用x(i,j)表示第i个个体在第j个维度上的取值,初始化群体,使得每个个体的每个维度都在其取值范围内随机生成一个初始值。 1.2 交叉和变异 随机选取三个不同的个体(a,b,c),通过以下公式产生一个新的个体x(i,new): x(i,new) = x(a,j) + F * (x(b,j) - x(c,j)) 其中F为缩放因子,通常取值在[0,2]之间,j为随机选取的维度。这个公式的含义是在a,b,c三个个体之间进行差分运算,得到一个差分向量,再将其加到a个体上得到新的个体。 1.3 选择 将原来的个体x(i)和新的个体x(i,new)进行比较,选择适应度更好的个体作为下一代的个体。 1.4 终止条件 当达到指定的迭代次数或者适应度函数达到指定的阈值时,停止算法。 2. C++实现 下面是差分进化算法的C++实现代码,其中包括初始化、交叉和变异、选择和终止条件判断等部分。 ``` #include <iostream> #include <cmath> #include <cstdlib> #include <ctime> using namespace std; const int N = 100; // 群体大小 const int n = 10; // 个体维度 const int max_iter = 1000; // 最大迭代次数 const double F = 0.5; // 缩放因子 const double CR = 0.9; // 交叉概率 const double eps = 1e-6; // 终止条件 const double lb = -5.12; // 取值下界 const double ub = 5.12; // 取值上界 double x[N][n], f[N]; // 个体和适应度 double best_x[n], best_f; // 全局最优解 // 初始化 void init() { srand(time(NULL)); for (int i = 0; i < N; i++) { for (int j = 0; j < n; j++) { x[i][j] = lb + (ub - lb) * rand() / RAND_MAX; } f[i] = 0; } best_f = 1e9; } // 适应度函数 double fun(double *x) { double sum = 0; for (int i = 0; i < n; i++) { sum += x[i] * x[i]; } return sum; } // 交叉和变异 void crossover(double *a, double *b, double *c, double *d) { int j = rand() % n; for (int i = 0; i < n; i++) { if (i == j || rand() / double(RAND_MAX) < CR) { d[i] = a[i] + F * (b[i] - c[i]); if (d[i] < lb || d[i] > ub) { d[i] = lb + (ub - lb) * rand() / RAND_MAX; } } else { d[i] = a[i]; } } } // 选择 void select() { for (int i = 0; i < N; i++) { double new_f = fun(x[i]); if (new_f < f[i]) { f[i] = new_f; for (int j = 0; j < n; j++) { x[i][j] = best_x[j]; } } if (new_f < best_f) { best_f = new_f; for (int j = 0; j < n; j++) { best_x[j] = x[i][j]; } } } } // 终止条件判断 bool stop() { double sum = 0; for (int i = 0; i < N; i++) { sum += (fun(x[i]) - best_f) * (fun(x[i]) - best_f); } return sqrt(sum / N) < eps; } // 差分进化算法 void DE() { init(); for (int iter = 0; iter < max_iter; iter++) { for (int i = 0; i < N; i++) { int a, b, c; do { a = rand() % N; } while (a == i); do { b = rand() % N; } while (b == a || b == i); do { c = rand() % N; } while (c == a || c == b || c == i); double d[n]; crossover(x[a], x[b], x[c], d); for (int j = 0; j < n; j++) { x[i][j] = d[j]; } } select(); if (stop()) { break; } } } int main() { DE(); cout << "best_f: " << best_f << endl; cout << "best_x: "; for (int i = 0; i < n; i++) { cout << best_x[i] << " "; } cout << endl; return 0; } ``` 在上述代码中,我们定义了一个N个个体、每个个体有n个维度的群体,用x(i,j)表示第i个个体在第j个维度上的取值。在初始化时,将每个个体在每个维度上随机生成一个初始值,并将其适应度初始化为0。在交叉和变异时,我们随机选取三个不同的个体(a,b,c),通过差分运算得到一个差分向量,再将其加到a个体上得到新的个体。在选择时,将原来的个体x(i)和新的个体x(i,new)进行比较,选择适应度更好的个体作为下一代的个体。在终止条件判断时,我们计算所有个体适应度和全局最优解的适应度之差的平方的平均值,如果小于指定的阈值,则停止算法。 3. 总结 本文介绍了差分进化算法的原理以及C++实现,差分进化算法是一种全局优化算法,具有收敛速度快、易于实现、不需要梯度信息等优点,在实际问题中得到了广泛的应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值