Skip to content

variables.c

文件信息

  • 📄 原文件:01_variables.c
  • 🔤 语言:c

完整代码

c
// ============================================================
//                      变量与数据类型
// ============================================================
// C 是静态类型语言,所有变量必须先声明后使用
// C 是系统级语言:直接操作内存,无垃圾回收,性能极高
// 标准:C89/C90、C99(推荐)、C11、C17
// 编译:gcc -std=c99 -Wall -o program 01_variables.c

#include <stdio.h>    // 标准输入输出
#include <stdint.h>   // 固定宽度整数类型(C99)
#include <stdbool.h>  // bool 类型(C99)
#include <limits.h>   // 整数类型极值
#include <float.h>    // 浮点类型极值

int main(void) {
    printf("=== C 变量与数据类型 ===\n");

    // ----------------------------------------------------------
    // 1. 整数类型
    // ----------------------------------------------------------
    // 【重要】C 标准只规定最小位宽,实际大小依赖平台
    // sizeof 运算符返回类型所占字节数

    char   c  = 'A';          // 字符,1字节,-128~127 或 0~255
    short  s  = 32767;        // 短整数,至少16位
    int    i  = 2147483647;   // 标准整数,至少16位(通常32位)
    long   l  = 2147483647L;  // 长整数,至少32位
    long long ll = 9223372036854775807LL; // 至少64位(C99)

    printf("char:      %d 字节,值=%c\n", (int)sizeof(c), c);
    printf("short:     %d 字节,值=%d\n", (int)sizeof(s), s);
    printf("int:       %d 字节,值=%d\n", (int)sizeof(i), i);
    printf("long:      %d 字节,值=%ld\n", (int)sizeof(l), l);
    printf("long long: %d 字节,值=%lld\n", (int)sizeof(ll), ll);

    // 无符号类型(unsigned):只存正数,范围是有符号的两倍
    unsigned int ui = 4294967295U;  // U 后缀
    unsigned long long ull = 18446744073709551615ULL;
    printf("unsigned int:       %u\n", ui);
    printf("unsigned long long: %llu\n", ull);

    // ----------------------------------------------------------
    // 2. 固定宽度整数(C99,推荐用于跨平台代码)
    // ----------------------------------------------------------
    // 【推荐】当需要精确宽度时,使用 stdint.h 中的类型
    printf("\n=== 固定宽度整数(stdint.h)===\n");

    int8_t   i8  = 127;
    int16_t  i16 = 32767;
    int32_t  i32 = 2147483647;
    int64_t  i64 = 9223372036854775807LL;
    uint8_t  u8  = 255;
    uint32_t u32 = 4294967295U;

    printf("int8_t:   %d(1字节)\n", i8);
    printf("int16_t:  %d(2字节)\n", i16);
    printf("int32_t:  %d(4字节)\n", i32);
    printf("int64_t:  %lld(8字节)\n", i64);
    printf("uint8_t:  %u\n", u8);
    printf("uint32_t: %u\n", u32);

    // ----------------------------------------------------------
    // 3. 浮点类型
    // ----------------------------------------------------------
    printf("\n=== 浮点类型 ===\n");

    float  f   = 3.14f;               // 单精度,32位,约7位有效数字
    double d   = 3.141592653589793;   // 双精度,64位,约15位有效数字(默认)
    long double ld = 3.14159265358979323846L; // 扩展精度,80或128位

    printf("float:       %.7f%d字节)\n", f, (int)sizeof(f));
    printf("double:      %.15f%d字节)\n", d, (int)sizeof(d));
    printf("long double: %.18Lf%d字节)\n", ld, (int)sizeof(ld));

    // 【警告】浮点精度问题
    double a = 0.1, b = 0.2;
    printf("0.1 + 0.2 = %.17f(不精确!)\n", a + b);
    printf("0.1 + 0.2 == 0.3:%s\n", (a + b == 0.3) ? "true" : "false");

    // ----------------------------------------------------------
    // 4. bool 类型(C99,需要 stdbool.h)
    // ----------------------------------------------------------
    printf("\n=== bool 类型 ===\n");

    bool is_valid = true;
    bool is_empty = false;
    printf("is_valid: %d,is_empty: %d\n", is_valid, is_empty);
    // 【注意】C 中 bool 本质是整数,0 为假,非 0 为真

    // ----------------------------------------------------------
    // 5. 变量声明与初始化
    // ----------------------------------------------------------
    printf("\n=== 变量声明 ===\n");

    // C89:变量必须在代码块开头声明
    // C99+:可以在使用前任意位置声明

    int x;          // 未初始化(局部变量值不确定,危险!)
    int y = 10;     // 声明并初始化
    int z = y * 2;  // 用表达式初始化

    // 【最佳实践】始终初始化变量
    x = 42;
    printf("x=%d, y=%d, z=%d\n", x, y, z);

    // 多变量声明(不推荐,降低可读性)
    int m = 1, n = 2, p = 3;
    printf("m=%d, n=%d, p=%d\n", m, n, p);

    // ----------------------------------------------------------
    // 6. 常量
    // ----------------------------------------------------------
    printf("\n=== 常量 ===\n");

    // const 修饰符:运行时常量(值不可修改)
    const double PI = 3.141592653589793;
    const int MAX_SIZE = 100;
    // PI = 3.14;  // 错误!const 变量不能修改

    // #define 宏:编译时文本替换
    #define GRAVITY 9.81
    #define APP_NAME "C 学习系统"

    printf("PI = %f\n", PI);
    printf("MAX_SIZE = %d\n", MAX_SIZE);
    printf("GRAVITY = %.2f\n", GRAVITY);
    printf("APP_NAME = %s\n", APP_NAME);

    // 枚举常量
    enum Day { MON=1, TUE, WED, THU, FRI, SAT, SUN };
    enum Day today = WED;
    printf("今天是第 %d\n", today);

    // ----------------------------------------------------------
    // 7. 字面量类型后缀
    // ----------------------------------------------------------
    printf("\n=== 字面量 ===\n");

    int dec  = 255;      // 十进制
    int oct  = 0377;     // 八进制(0 前缀)
    int hex  = 0xFF;     // 十六进制(0x 前缀)
    printf("十进制=%d, 八进制=%d, 十六进制=%d(同一个数)\n", dec, oct, hex);

    // 字符字面量(转义字符)
    char nl = '\n';   // 换行
    char tb = '\t';   // 制表符
    char bs = '\\';   // 反斜杠
    char sq = '\'';   // 单引号
    char nul = '\0';  // 空字符(字符串终止符)
    printf("转义:换行[%c]制表[%c]反斜杠[%c]单引号[%c]\n", nl, tb, bs, sq);

    // ----------------------------------------------------------
    // 8. 类型转换
    // ----------------------------------------------------------
    printf("\n=== 类型转换 ===\n");

    // 隐式转换(整数提升)
    char ch = 65;
    int promoted = ch;  // char 自动提升为 int
    printf("char %d -> int %d,字符 '%c'\n", ch, promoted, ch);

    // 混合类型运算
    int  dividend = 7;
    int  divisor  = 2;
    double result = dividend / divisor;   // 整数除法!结果 3.0
    double result2 = (double)dividend / divisor;  // 强制转换,结果 3.5
    printf("7/2(整数除法)= %.1f\n", result);
    printf("(double)7/2  = %.1f\n", result2);

    // 显式强制转换
    double pi = 3.99;
    int truncated = (int)pi;  // 截断小数,不是四舍五入
    printf("(int)3.99 = %d(截断)\n", truncated);

    printf("\n=== 变量与类型演示完成 ===\n");
    return 0;
}

💬 讨论

使用 GitHub 账号登录后即可参与讨论

基于 MIT 许可发布