当前位置: 首页 > article >正文

C语言中的变量与常量

变量

定义

变量是程序中用于存储数据的容器。在C语言中,变量需要先声明后使用,声明时需要指定变量的类型。变量的类型决定了变量可以存储的数据类型以及变量在内存中的大小。

命名规则

C 语言变量命名规则

规则详细说明示例
字符组成变量名只能包含字母(a-z、A-Z)、数字(0-9)和下划线(_)。int myVariable;
首字符变量名必须以字母或下划线开头,不能以数字开头。int _myVariable;<br>错误示例int 1variable;
大小写敏感C 语言是大小写敏感的,Variable 和 variable 是两个不同的变量。int Variable;<br>int variable;
有意义的名称变量名应具有描述性,能够表明变量所代表的含义。int studentScore;
避免使用缩写尽量避免使用缩写,除非该缩写在团队中非常通用。int studentScore;<br>避免int sScore;
驼峰式命名法对于多个单词组成的变量名,使用驼峰式命名法(camelCase)。int studentScore;<br>int userAge;
下划线命名法也可以使用下划线命名法(snake_case),特别是在类的成员变量或全局变量中。int student_score;<br>int user_age;
前缀规则根据变量的作用域和类型使用前缀。int c_myVar;(局部变量)<br>int m_myVar;(类的成员变量)<br>int sm_myVar;(类的静态成员变量)

Vue 3 中的变量命名规则

特性/方法命名规则示例
ref使用小写字母开头,驼峰式命名法。const count = ref(0);<br>const userName = ref('John');
reactive使用小写字母开头,驼峰式命名法。const state = reactive({ count: 0, userName: 'John' });

通用编程变量命名规则

规则详细说明示例
描述性名称变量名应具有描述性,能够表明变量所代表的含义。int studentScore;
驼峰式命名法对于多个单词组成的变量名,使用驼峰式命名法(camelCase)。int studentScore;<br>int userAge;
下划线命名法也可以使用下划线命名法(snake_case),特别是在类的成员变量或全局变量中。int student_score;<br>int user_age;
避免使用缩写尽量避免使用缩写,除非该缩写在团队中非常通用。int studentScore;<br>避免int sScore;
前缀规则根据变量的作用域和类型使用前缀。int c_myVar;(局部变量)<br>int m_myVar;(类的成员变量)<br>int sm_myVar;(类的静态成员变量)
一致性保持命名的一致性,特别是在团队协作和代码维护中。int count;<br>int title;<br>void handleClick();

变量数据类型

数据类型关键字用途大小(字节)取值范围示例
整型int存储整数通常为 4 字节-2,147,483,648 到 2,147,483,647int age = 25;
short存储较短的整数通常为 2 字节-32,768 到 32,767short count = 100;
long存储较长的整数通常为 4 字节-2,147,483,648 到 2,147,483,647long distance = 1000000;
long long存储非常长的整数通常为 8 字节-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807long long bigNumber = 1234567890123456789;
unsigned int存储无符号整数通常为 4 字节0 到 4,294,967,295unsigned int index = 1000;
unsigned short存储无符号短整数通常为 2 字节0 到 65,535unsigned short port = 8080;
unsigned long存储无符号长整数通常为 4 字节0 到 4,294,967,295unsigned long size = 1000000;
unsigned long long存储无符号非常长的整数通常为 8 字节0 到 18,446,744,073,709,551,615unsigned long long bigSize = 1234567890123456789;
字符型char存储字符1 字节-128 到 127char grade = 'A';
unsigned char存储无符号字符1 字节0 到 255unsigned char ch = 255;
浮点型float存储单精度浮点数通常为 4 字节1.2E-38 到 3.4E+38float price = 19.99;
double存储双精度浮点数通常为 8 字节2.3E-308 到 1.7E+308double salary = 123456.78;
long double存储扩展精度浮点数通常为 10 或 16 字节3.4E-4932 到 1.1E+4932long double pi = 3.14159265358979323846;
布尔型_Bool存储布尔值1 字节0 或 1_Bool isTrue = 1;
指针int*存储整型变量的地址通常为 4 或 8 字节依赖于系统架构int* ptr = &age;
char*存储字符型变量的地址通常为 4 或 8 字节依赖于系统架构char* str = "Hello";
float*存储浮点型变量的地址通常为 4 或 8 字节依赖于系统架构float* p = &price;
数组int[]存储多个整数依赖于数组长度和元素类型依赖于数组长度和元素类型int numbers[] = {1, 2, 3, 4, 5};
char[]存储多个字符依赖于数组长度依赖于数组长度char name[] = "John";
float[]存储多个浮点数依赖于数组长度和元素类型依赖于数组长度和元素类型float prices[] = {19.99, 29.99, 39.99};
结构体struct存储多个不同类型的数据依赖于成员变量依赖于成员变量struct Person { int age; char name[50]; };
联合体union存储多个不同类型的数据,但同一时间只能存储一个依赖于最大成员变量依赖于最大成员变量union Data { int i; float f; char str[20]; };
枚举enum存储一组命名的常量通常为 4 字节依赖于枚举值enum Weekday { MON, TUE, WED, THU, FRI, SAT, SUN };

变量的作用域

变量的作用域是指变量在程序中有效的范围,其中C语言的作用域包括:局部变量、全局变量、块作用域变量、文件作用域变量、静态局部变量、静态全局变量

局部变量

在函数内部声明的变量,只能在该函数内部访问。

void function() {
    int localVar = 20; // 局部变量
    // 只能在这里访问 localVar
}

全局变量

在函数外部声明的变量,可以在整个程序中访问。

int globalVar = 10; // 全局变量

void function() {
    // 可以访问 globalVar
}

块作用域变量

在代码块(如{}内的代码)中声明的变量,只能在该代码块内访问。

void function() {
    {
        int blockVar = 30; // 块作用域变量
        // 只能在这里访问 blockVar
    }
    // 不能在这里访问 blockVar
}

文件作用域变量

使用static关键字在函数外部声明的变量,只能在声明它的文件内部访问。

static int fileScopeVar = 40; // 文件作用域变量

void function() {
    // 可以访问 fileScopeVar
}

函数作用域变量(通常指静态局部变量)

在函数内部使用static关键字声明的变量,它在函数调用之间保持其值,但只能在该函数内部访问。

void function() {
    static int staticLocalVar = 50; // 静态局部变量
    // 每次调用函数时,staticLocalVar 保持其值
}

静态全局变量

在所有函数外部声明的静态变量,只在定义它的文件内部有效。

static int staticGlobalVar = 40; // 静态全局变量

void func() {
    printf("静态全局变量: %d\n", staticGlobalVar);
}

int main() {
    func();
    // 在其他文件中无法访问 staticGlobalVar
    return 0;
}

变量生命周期

生命周期是指变量在程序中存在的时间段,其中C语言的变量生命周期包括静态存储期、自动存储期、动态存储期。

静态存储期

全局变量和静态变量的生命周期从程序开始运行到程序结束。

int globalVar = 60; // 全局变量
static int staticVar = 70; // 静态全局变量

void func() {
    static int staticLocalVar = 80; // 静态局部变量
    printf("静态局部变量: %d\n", staticLocalVar);
    staticLocalVar++;
}

int main() {
    printf("全局变量: %d\n", globalVar);
    printf("静态全局变量: %d\n", staticVar);
    func(); // 输出: 静态局部变量: 80
    func(); // 输出: 静态局部变量: 81
    return 0;
}

自动存储期

局部变量的生命周期从变量声明开始,到函数结束时结束。

void func() {
    int localVar = 50; // 局部变量
    printf("局部变量: %d\n", localVar);
    // localVar 在函数结束时被销毁
}

int main() {
    func();
    return 0;
}

动态存储期

通过动态内存分配(如malloc在C语言中)创建的变量,其生命周期从分配开始,到 free 调用结束。

#include <stdlib.h>
#include <stdio.h>

int main() {
    int* dynamicVar = (int*)malloc(sizeof(int)); // 动态分配内存
    if (dynamicVar == NULL) {
        printf("内存分配失败\n");
        return 1;
    }
    *dynamicVar = 90;
    printf("动态分配的变量: %d\n", *dynamicVar);
    free(dynamicVar); // 释放内存
    return 0;
}

综合例子

#include <stdio.h>
#include <stdlib.h>

// 全局变量
int globalVar = 10;

// 文件作用域变量
static int fileScopeVar = 20;

void function() {
    // 静态局部变量
    static int staticLocalVar = 30;

    // 局部变量
    int localVar = 40;

    // 块作用域变量
    {
        int blockVar = 50;
        printf("blockVar: %d\n", blockVar); // 可以访问 blockVar
    }
    // printf("blockVar: %d\n", blockVar); // 错误:blockVar 在这里不可访问

    printf("globalVar: %d\n", globalVar);   // 可以访问 globalVar
    printf("fileScopeVar: %d\n", fileScopeVar); // 可以访问 fileScopeVar
    printf("staticLocalVar: %d\n", staticLocalVar); // 可以访问 staticLocalVar
    printf("localVar: %d\n", localVar);    // 可以访问 localVar

    // 动态分配内存
    int *dynamicVar = (int*)malloc(sizeof(int));
    if (dynamicVar != NULL) {
        *dynamicVar = 60;
        printf("dynamicVar: %d\n", *dynamicVar); // 可以访问 dynamicVar
        // 释放内存
        free(dynamicVar);
    }

    // staticLocalVar 在下次函数调用时保持其值
    staticLocalVar++;
    printf("Incremented staticLocalVar: %d\n", staticLocalVar);
}

int main() {
    function();
    function(); // 调用第二次以显示 staticLocalVar 的持久性

    // 可以访问 globalVar 和 fileScopeVar,但不能直接访问 localVar、blockVar 和 staticLocalVar(因为它们的作用域不在这里)
    printf("globalVar in main: %d\n", globalVar);
    printf("fileScopeVar in main: %d\n", fileScopeVar);

    return 0;
}

常量

定义

常量是程序中值不能改变的量。常量在声明时必须初始化,并且其值在程序运行过程中不能被修改。

常量类型

  1. 整数常量:可以是十进制、八进制(以0开头)或十六进制(以0x或0X开头)表示。
    #include <stdio.h>
    
    int main() {
        const int MAX_USERS = 100; // 整型常量
        printf("最大用户数: %d\n", MAX_USERS);
        // MAX_USERS = 200; // 错误,常量不能被修改
        return 0;
    }

  2. 浮点常量:由整数部分、小数点、小数部分和指数部分组成,可以使用小数形式或指数形式表示。
    #include <stdio.h>
    
    int main() {
        const float PI = 3.14159; // 浮点型常量
        printf("圆周率: %f\n", PI);
        // PI = 3.14; // 错误,常量不能被修改
        return 0;
    }

  3. 字符常量:用单引号括起来的单个字符,如'A'、'\n'等。
    #include <stdio.h>
    
    int main() {
        const char NEWLINE = '\n'; // 字符型常量
        printf("这是一个字符型常量: %c", NEWLINE);
        // NEWLINE = '\r'; // 错误,常量不能被修改
        return 0;
    }

  4. 字符串常量:用双引号括起来的字符序列,如"Hello, World!"。
    #include <stdio.h>
    
    int main() {
        const char* GREETING = "Hello, World!"; // 字符串常量
        printf("%s\n", GREETING);
        // GREETING = "Hi, World!"; // 错误,常量指针的值不能被修改
        return 0;
    }

  5. 枚举常量:通过 enum 关键字定义的一组命名的整数常量。
    #include <stdio.h>
    
    enum Weekday { MON, TUE, WED, THU, FRI, SAT, SUN };
    
    int main() {
        const enum Weekday today = MON; // 枚举常量
        printf("今天是: %d\n", today);
        // today = TUE; // 错误,常量不能被修改
        return 0;
    }

常量的定义方法

在C语言中,常量可以通过以下两种方式定义:

  1. 使用#define预处理器
    • #define是预处理命令,用于定义符号常量。
    • 定义形式为:#define 标识符 常量值
    • 例如:#define PI 3.1416,定义了符号常量PI,其值为3.1416。
      #include <stdio.h>
      
      #define PI 3.1415926  // 定义宏常量PI,表示圆周率
      #define MAX_NUM 100   // 定义宏常量MAX_NUM,表示最大数值
      
      int main() {
          double circle_area = PI * 5 * 5;  // 在代码中使用PI,预处理时会替换为3.1415926
          int num = MAX_NUM;  // 使用MAX_NUM,会替换为100
          printf("用#define定义的常量示例:圆面积 = %lf\n", circle_area);
          printf("最大数值示例: %d\n", num);
          return 0;
      }

  2. 使用const关键字
    • const是C语言中的关键字,用于声明常量。
    • 定义形式为:const 数据类型 变量名 = 常量值
    • 例如:const int MAX_SIZE = 100,定义了整型常量MAX_SIZE,其值为100。
      #include <stdio.h>
      
      int main() {
          const int num = 10;  // 定义常变量num,初始值为10,后续不能修改其值
          // num = 20;  // 这行代码是错误的,试图修改常变量的值,编译会报错
          printf("用const定义的常量示例: %d\n", num);
          return 0;
      }

总结

特性变量 (Variables)常量 (Constants)
定义用于存储数据的容器,可以在程序运行期间修改其值。固定不变的值,在程序运行期间不能修改。
声明方式使用数据类型声明,例如:int age;使用 const 关键字声明,例如:const int MAX_STUDENTS = 100;<br>使用 #define 预处理器指令声明,例如:#define PI 3.14159
数据类型必须指定数据类型,例如:intfloatchar 等。可以指定数据类型(使用 const),也可以不指定数据类型(使用 #define)。
作用域可以有局部作用域(在函数或代码块内声明)和全局作用域(在所有函数之外声明)。可以有局部作用域(在函数或代码块内声明)和全局作用域(在所有函数之外声明)。
生命周期从声明开始,到其作用域结束。从声明开始,到其作用域结束。
修改性可以在程序运行期间修改其值。一旦赋值,就不能再修改其值。
类型检查编译器会进行类型检查,确保赋值和操作符合数据类型要求。使用 const 定义的常量有数据类型,编译器会进行类型检查;使用 #define 定义的常量没有数据类型,只是简单的文本替换。
内存分配占用内存空间,存储实际数据。占用内存空间,存储实际数据。
示例c<br>int age = 25;<br>float height = 1.75;<br>c<br>const int MAX_STUDENTS = 100;<br>const float PI = 3.14159;<br>#define MAX_AGE 120<br>#define PI 3.14159<br>


http://www.kler.cn/a/487663.html

相关文章:

  • G1原理—2.G1是如何提升分配对象效率
  • 在 macOS 中,设置自动将文件夹排在最前
  • 数据结构(1~10)
  • 实现自定义集合类:深入理解C#中的IEnumerable<T>接口
  • 推动多语言语音科技迈向新高度:INTERSPEECH 2025 ML-SUPERB 2.0 挑战赛
  • 成为LabVIEW自由开发者
  • 【学Rust开发CAD】2 创建第一个工作空间、项目及库
  • 代码随想录 哈希 test 8
  • Oracle Dataguard(主库为双节点集群)配置详解(2):备库安装 Oracle 软件
  • Android14上使用libgpiod[gpioinfo gpioget gpioset ...]
  • Word快捷键汇总
  • 《软硬协同优化,解锁鸿蒙系统AI应用性能新高度》
  • 《通过财报看企业》
  • springmvc搭建流程
  • ClickHouse 教程
  • # 网络编程 - 轻松入门不含糊
  • 杭州铭师堂的云原生升级实践
  • 【轻松学C:编程小白的大冒险】--- 选择 开发工具(IDE)Dev-c++ 03
  • 初识FPGA
  • Qt C++读写NFC标签NDEF网址URI
  • 第30天:PHP应用组件框架前端模版渲染三方插件富文本编辑器CVE审计
  • Java 语法糖详解
  • 如何评价deepseek-V3 VS OpenAI o1 自然语言处理成Sql的能力
  • 智能合约:区块链世界的自动化契约
  • 深入分析 Android BroadcastReceiver (四)
  • 创建型模式3.建造者模式