编程语言 · 2023年 10月 27日 0

const

15 次浏览

const关键字出现在不少编程语言中,它是防御性描述,提醒编译器注意相应的变量或常量不能被修改。当然,编译器无法检测hack刻意躲过检查的行为。

不同语言的const

  • C语言的const修饰的不是常规的”常量”,而是”不可修改”的变量。但实际上,和常量效果一样。本质在于C语言根本没有所谓常量的概念,用const来假装有常量。
  • C++ const真的是常量,比C语言的使用更广泛,尤其是类成员函数用到const引用,iostream就包含很多const修饰符。C++17引入了constexpr关键字,可修饰新的类型,如函数、类等,使得常量控制更强大。
    • constexpr int get_size() { return 3; }
    • char arr[get_size()]; // 合法!
    • 尽管如此,constexpr不一定保证编译期完成,C++20又引入了consteval确保一定是编译期完成。
  • Java用final代表常量,有意思的是const属于Java的预留关键字,但不能用。
  • C#除了有const,还有readonly关键字可以在构造函数初始化,不受局限于声明初始化。
  • Python没有const关键字。
  • Go支持多个标识符的const初始化,用括号包起来。
  • Rust支持const.
  • JS在ES6之后引入了const关键字。

const的指针还是常量?

有指针的编程语言就是复杂,const和指针的组合让大家摸不到头脑。究竟是变量是const还是指针const?一个比较有意思的原则是,”从右向左读”的解析方法很实用。

  • C语言:”const int * const p”解读方式是”从右向左”读的方法
    • const int * p是”p” “指向” “整形” “常量”.
    • const int * const p是”p” “常” “指向” “整形” “常量”.

const和代码大小

一般而言相比没有const修饰,加const修饰后不会增加代码大小,可能减小代码大小。编译器利用const修饰优化对应的变量,如果可能用常数代替或者引用已有变量而不拷贝新的变量。