Skip to content

基础语法

本章将介绍C语言的基础语法,包括变量、常量、关键字和输入输出操作。

变量

变量的定义

变量是程序中存储数据的容器。在C语言中,使用变量前必须先声明其类型。

c
/*
 * 变量的定义和初始化
 */

#include <stdio.h>

int main(void)
{
    /* 变量声明 */
    int age;           /* 声明一个整型变量 */
    float height;      /* 声明一个浮点型变量 */
    char grade;        /* 声明一个字符变量 */
    
    /* 变量初始化 */
    age = 25;          /* 赋值 */
    height = 175.5;    /* 赋值 */
    grade = 'A';       /* 赋值 */
    
    /* 声明并初始化(推荐) */
    int count = 0;
    double price = 99.99;
    char initial = 'J';
    
    /* 同时声明多个同类型变量 */
    int x = 1, y = 2, z = 3;
    
    /* 输出变量的值 */
    printf("年龄: %d\n", age);
    printf("身高: %.1f\n", height);
    printf("等级: %c\n", grade);
    
    return 0;
}

变量的命名规则

c
/*
 * 变量命名规则
 */

#include <stdio.h>

int main(void)
{
    /* 合法的变量名 */
    int age;           /* 小写字母 */
    int Age;           /* 大写字母(与age不同,C语言区分大小写) */
    int student_age;   /* 下划线分隔 */
    int studentAge;    /* 驼峰命名 */
    int _count;        /* 下划线开头 */
    int count1;        /* 包含数字 */
    
    /* 非法的变量名 */
    /* int 2nd_place; */    /* 不能以数字开头 */
    /* int my-var; */       /* 不能包含连字符 */
    /* int int; */          /* 不能使用关键字 */
    /* int my var; */       /* 不能包含空格 */
    
    /* 命名建议 */
    int student_count;     /* 推荐:有意义的名称 */
    int max_value;         /* 推荐:描述性命名 */
    
    return 0;
}

变量的作用域

c
/*
 * 变量的作用域
 */

#include <stdio.h>

/* 全局变量:在整个程序中可见 */
int global_var = 100;

/* 函数声明 */
void test_function(void);

int main(void)
{
    /* 局部变量:只在main函数中可见 */
    int local_var = 10;
    
    printf("全局变量: %d\n", global_var);
    printf("局部变量: %d\n", local_var);
    
    /* 代码块内的变量 */
    {
        int block_var = 20;  /* 只在这个代码块内可见 */
        printf("代码块变量: %d\n", block_var);
        
        /* 可以访问外层变量 */
        printf("访问局部变量: %d\n", local_var);
    }
    
    /* block_var 在这里不可见 */
    /* printf("%d\n", block_var); */  /* 错误 */
    
    test_function();
    
    return 0;
}

void test_function(void)
{
    /* 可以访问全局变量 */
    printf("函数中访问全局变量: %d\n", global_var);
    
    /* 不能访问main中的局部变量 */
    /* printf("%d\n", local_var); */  /* 错误 */
    
    /* 同名的局部变量会隐藏全局变量 */
    int global_var = 200;
    printf("局部同名变量: %d\n", global_var);  /* 输出200 */
}

常量

使用 const 关键字

c
/*
 * 使用 const 定义常量
 */

#include <stdio.h>

int main(void)
{
    /* const 定义的常量必须初始化 */
    const int MAX_SIZE = 100;     /* 整型常量 */
    const double PI = 3.14159;    /* 浮点型常量 */
    const char NEWLINE = '\n';    /* 字符常量 */
    
    /* 使用常量 */
    printf("最大尺寸: %d\n", MAX_SIZE);
    printf("圆周率: %.5f\n", PI);
    
    /* 常量不能修改 */
    /* MAX_SIZE = 200; */  /* 错误:不能修改常量 */
    
    return 0;
}

使用 #define 定义宏常量

c
/*
 * 使用 #define 定义常量
 */

#include <stdio.h>

/* 宏定义:在编译前进行文本替换 */
#define MAX_SIZE 100
#define PI 3.14159
#define NEWLINE '\n'
#define MESSAGE "Hello, C!"

/* 带参数的宏 */
#define SQUARE(x) ((x) * (x))
#define MAX(a, b) ((a) > (b) ? (a) : (b))

int main(void)
{
    printf("最大尺寸: %d\n", MAX_SIZE);
    printf("圆周率: %.5f\n", PI);
    printf("消息: %s\n", MESSAGE);
    
    /* 使用带参数的宏 */
    int num = 5;
    printf("%d的平方: %d\n", num, SQUARE(num));
    printf("10和20的最大值: %d\n", MAX(10, 20));
    
    return 0;
}

枚举常量

c
/*
 * 使用枚举定义常量
 */

#include <stdio.h>

/* 枚举类型 */
enum WeekDay {
    SUNDAY,      /* 默认值为0 */
    MONDAY,      /* 默认值为1 */
    TUESDAY,     /* 默认值为2 */
    WEDNESDAY,   /* 默认值为3 */
    THURSDAY,    /* 默认值为4 */
    FRIDAY,      /* 默认值为5 */
    SATURDAY     /* 默认值为6 */
};

/* 指定值的枚举 */
enum Month {
    JANUARY = 1,
    FEBRUARY = 2,
    MARCH = 3,
    APRIL = 4,
    MAY = 5,
    JUNE = 6,
    JULY = 7,
    AUGUST = 8,
    SEPTEMBER = 9,
    OCTOBER = 10,
    NOVEMBER = 11,
    DECEMBER = 12
};

/* 枚举可以指定部分值 */
enum Color {
    RED = 10,
    GREEN,       /* 11 */
    BLUE = 20,
    YELLOW       /* 21 */
};

int main(void)
{
    /* 使用枚举常量 */
    enum WeekDay today = WEDNESDAY;
    printf("今天是周%d\n", today + 1);  /* 输出:今天是周4 */
    
    enum Month current = JULY;
    printf("当前月份: %d\n", current);
    
    enum Color favorite = GREEN;
    printf("喜欢的颜色代码: %d\n", favorite);
    
    return 0;
}

关键字

C语言关键字列表

c
/*
 * C语言关键字(共32个)
 */

/*
 * 数据类型关键字(12个):
 * char    - 字符类型
 * short   - 短整型
 * int     - 整型
 * long    - 长整型
 * float   - 单精度浮点型
 * double  - 双精度浮点型
 * signed  - 有符号
 * unsigned- 无符号
 * struct  - 结构体
 * union   - 联合体
 * enum    - 枚举
 * void    - 无类型
 *
 * 控制语句关键字(12个):
 * if      - 条件语句
 * else    - 条件语句的否定分支
 * switch  - 多分支选择语句
 * case    - switch的分支
 * default - switch的默认分支
 * for     - 循环语句
 * do      - 循环语句
 * while   - 循环语句
 * break   - 跳出循环
 * continue- 继续下一次循环
 * goto    - 无条件跳转
 * return  - 函数返回
 *
 * 存储类型关键字(4个):
 * auto    - 自动变量(默认)
 * static  - 静态变量
 * extern  - 外部变量
 * register- 寄存器变量
 *
 * 其他关键字(4个):
 * const   - 常量
 * sizeof  - 计算大小
 * typedef - 类型定义
 * volatile- 易变变量
 */

关键字使用示例

c
/*
 * 关键字使用示例
 */

#include <stdio.h>

/* typedef 定义类型别名 */
typedef unsigned int uint;
typedef char* String;

/* extern 声明外部变量 */
extern int external_var;

/* static 静态变量 */
void counter(void)
{
    static int count = 0;  /* 静态局部变量,只初始化一次 */
    count++;
    printf("调用次数: %d\n", count);
}

int main(void)
{
    /* sizeof 计算大小 */
    printf("int的大小: %zu 字节\n", sizeof(int));
    printf("double的大小: %zu 字节\n", sizeof(double));
    
    /* typedef 的使用 */
    uint num = 100;
    String name = "张三";
    printf("数字: %u, 名字: %s\n", num, name);
    
    /* volatile 告诉编译器不要优化 */
    volatile int sensor_value;
    sensor_value = 10;
    
    /* static 函数调用 */
    counter();  /* 输出: 调用次数: 1 */
    counter();  /* 输出: 调用次数: 2 */
    counter();  /* 输出: 调用次数: 3 */
    
    return 0;
}

输入输出

printf 格式化输出

c
/*
 * printf 格式化输出
 */

#include <stdio.h>

int main(void)
{
    /* 基本格式说明符 */
    int num = 100;
    float pi = 3.14159;
    double e = 2.71828;
    char ch = 'A';
    char str[] = "Hello";
    
    /* %d - 十进制整数 */
    printf("整数: %d\n", num);
    
    /* %f - 浮点数 */
    printf("浮点数: %f\n", pi);
    
    /* %.nf - 保留n位小数 */
    printf("保留2位小数: %.2f\n", pi);
    
    /* %lf - 双精度浮点数 */
    printf("双精度: %lf\n", e);
    
    /* %c - 字符 */
    printf("字符: %c\n", ch);
    
    /* %s - 字符串 */
    printf("字符串: %s\n", str);
    
    /* %x - 十六进制(小写) */
    printf("十六进制: %x\n", num);
    
    /* %X - 十六进制(大写) */
    printf("十六进制: %X\n", num);
    
    /* %o - 八进制 */
    printf("八进制: %o\n", num);
    
    /* %u - 无符号整数 */
    unsigned int unum = 4294967295;
    printf("无符号整数: %u\n", unum);
    
    /* %% - 输出百分号 */
    printf("百分号: %%\n");
    
    return 0;
}

printf 宽度和对齐

c
/*
 * printf 宽度和对齐控制
 */

#include <stdio.h>

int main(void)
{
    int num = 42;
    
    /* 宽度控制 */
    printf("默认: %d\n", num);
    printf("宽度5: %5d\n", num);      /* 右对齐,占5个字符宽度 */
    printf("宽度10: %10d\n", num);    /* 右对齐,占10个字符宽度 */
    
    /* 左对齐 */
    printf("左对齐: %-5d结束\n", num);
    printf("左对齐: %-10d结束\n", num);
    
    /* 补零 */
    printf("补零: %05d\n", num);      /* 00042 */
    printf("补零: %010d\n", num);     /* 0000000042 */
    
    /* 浮点数宽度和精度 */
    double pi = 3.14159265;
    printf("宽度10精度2: %10.2f\n", pi);
    printf("左对齐宽度10精度2: %-10.2f结束\n", pi);
    
    /* 字符串宽度和精度 */
    char str[] = "Hello, World!";
    printf("字符串宽度20: %20s\n", str);
    printf("字符串左对齐: %-20s结束\n", str);
    printf("字符串截取: %.5s\n", str);  /* 只输出前5个字符 */
    
    return 0;
}

scanf 格式化输入

c
/*
 * scanf 格式化输入
 */

#include <stdio.h>

int main(void)
{
    int age;
    float height;
    char name[50];
    char grade;
    
    /* 输入整数 */
    printf("请输入年龄: ");
    scanf("%d", &age);  /* 注意:必须使用 & 取地址 */
    printf("年龄: %d\n", age);
    
    /* 输入浮点数 */
    printf("请输入身高(cm): ");
    scanf("%f", &height);
    printf("身高: %.1f cm\n", height);
    
    /* 输入字符串 */
    printf("请输入姓名: ");
    scanf("%s", name);  /* 字符数组名本身就是地址,不需要 & */
    printf("姓名: %s\n", name);
    
    /* 输入字符 */
    printf("请输入等级(A/B/C/D): ");
    scanf(" %c", &grade);  /* 注意:%c前的空格用于跳过空白字符 */
    printf("等级: %c\n", grade);
    
    /* 同时输入多个值 */
    int a, b;
    printf("请输入两个整数(用空格分隔): ");
    scanf("%d %d", &a, &b);
    printf("你输入的是: %d%d\n", a, b);
    
    return 0;
}

字符输入输出函数

c
/*
 * 字符输入输出函数
 */

#include <stdio.h>

int main(void)
{
    char ch;
    
    /* getchar() 和 putchar() */
    printf("请输入一个字符: ");
    ch = getchar();        /* 读取一个字符 */
    printf("你输入的字符是: ");
    putchar(ch);           /* 输出一个字符 */
    putchar('\n');
    
    /* getc() 和 putc() */
    printf("请再输入一个字符: ");
    ch = getc(stdin);      /* 从标准输入读取 */
    printf("你输入的字符是: ");
    putc(ch, stdout);      /* 输出到标准输出 */
    putc('\n', stdout);
    
    /* 读取一行字符 */
    char buffer[100];
    int i = 0;
    
    printf("请输入一行文字: ");
    getchar();  /* 清除缓冲区中的换行符 */
    
    while ((ch = getchar()) != '\n' && i < 99) {
        buffer[i++] = ch;
    }
    buffer[i] = '\0';  /* 字符串结束符 */
    
    printf("你输入的是: %s\n", buffer);
    
    return 0;
}

字符串输入输出函数

c
/*
 * 字符串输入输出函数
 */

#include <stdio.h>

int main(void)
{
    char name[50];
    char sentence[200];
    
    /* gets() - 不推荐使用,可能导致缓冲区溢出 */
    /* gets(name); */  /* 危险!不检查缓冲区大小 */
    
    /* fgets() - 推荐使用 */
    printf("请输入姓名: ");
    fgets(name, sizeof(name), stdin);
    
    /* 去除末尾的换行符 */
    int len = 0;
    while (name[len] != '\0' && name[len] != '\n') {
        len++;
    }
    name[len] = '\0';
    
    printf("姓名: %s\n", name);
    
    /* puts() - 输出字符串并自动换行 */
    puts("这是一行文字");  /* 等价于 printf("这是一行文字\n"); */
    
    /* fputs() - 输出字符串到指定文件流 */
    fputs("这是另一行文字", stdout);
    putchar('\n');  /* fputs不会自动换行 */
    
    return 0;
}

转义字符

c
/*
 * 转义字符
 */

#include <stdio.h>

int main(void)
{
    /* 常用转义字符 */
    
    /* \n - 换行 */
    printf("第一行\n第二行\n");
    
    /* \t - 水平制表符 */
    printf("姓名\t年龄\t城市\n");
    printf("张三\t25\t北京\n");
    
    /* \\ - 反斜杠 */
    printf("文件路径: C:\\Users\\Documents\n");
    
    /* \' - 单引号 */
    printf("单引号: \'\n");
    
    /* \" - 双引号 */
    printf("双引号: \"Hello\"\n");
    
    /* \r - 回车(光标移到行首) */
    printf("Hello\rWorld\n");  /* 输出: World(Hello被覆盖) */
    
    /* \b - 退格 */
    printf("Hello\b World\n");  /* 输出: Hell World */
    
    /* \a - 警报(响铃) */
    /* printf("\a"); */  /* 可能会发出声音 */
    
    /* \0 - 空字符(字符串结束符) */
    char str[] = {'H', 'i', '\0'};
    printf("字符串: %s\n", str);
    
    /* \xhh - 十六进制表示 */
    printf("十六进制: \x41\n");  /* 输出: A */
    
    /* \ooo - 八进制表示 */
    printf("八进制: \101\n");  /* 输出: A */
    
    return 0;
}

小结

本章学习了:

  • 变量:定义、命名规则、作用域
  • 常量:const、#define、枚举
  • 关键字:32个关键字的分类和用途
  • 输出:printf格式化输出、宽度对齐控制
  • 输入:scanf格式化输入、字符和字符串输入
  • 转义字符:常用的转义字符

下一章,我们将学习数据类型,了解C语言的各种数据类型。