Appearance
基础语法
本章将介绍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语言的各种数据类型。
