返回介绍

2. 常量

发布于 2024-10-12 21:58:08 字数 1306 浏览 0 评论 0 收藏 0

常量值 在运行过程中恒定不变。

常量表达式 在编译期计算,其操作数可以是整数、浮点数、枚举、字符、字符串等字面量,以及强制类型转换、sizeof 运算符和其他常量表达式。

字面量(literal)是源代码中表示固定值的符号,比如 123'a'"hello" 等。

定义常量:

  • #define : 预处理指令。编译预处理阶段文本替换。
  • const : 关键字。或可做只读变量(read-only)。
#define MIN 0          // 不能以分号结尾。
const int MAX = 100;

int main (void)
{
    printf("%d, %d\n", MIN, MAX);
    return 0;
}

注意:const 定义的全局常量是外链接,可被其他模块(源文件)引用(extern)。可改成 static 阻止。

常量值 被编译器直接充作指令操作数,或存储到只读段(.rodata)内。即便栈内分配,编译器也不允许修改。

注意:区分 常量值 和 常量值 指针

可利用指针变向修改可读写内存区分配的 “常量”。

int main (void)
{
    const int max = 100;  // stack
    // max = 200;         // error: assignment of read-only variable 'max'

    int *p = &max;        // ISO C 禁止,但 GNU 可以。
    *p = 200;

    printf("%d\n", max);
    return 0;
}
const int MAX = 100;  // .rodata

int main (void)
{
    int *p = &MAX;
    *p = 200;        // Segmentation fault

    printf("%d\n", MAX);
    return 0;
}

常量名通常建议大写,以区分变量。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文