作为一门经典的编程语言,C语言以其强大的功能和广泛的应用场景,成为了许多编程初学者的首选语言。本文将为你带来C语言的基础知识,帮助你迈出编程世界的第一步。
什么是C语言?
C语言是一门通用的计算机编程语言,广泛应用于底层开发。它的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量机器码,且无需任何运行环境支持就能运行的编程语言。
尽管C语言提供了许多低级处理的功能,但它仍然保持着良好的跨平台特性。一个标准规格的C语言程序可以在多种电脑平台上编译运行,包括嵌入式处理器(单片机或MCU)和超级电脑等。
C语言是面向过程的编程语言,与C++、Java等面向对象的编程语言有所不同。常见的C语言编译器包括Clang、GCC、WIN-TC、SUBLIME、MSVC、Turbo C等。
第一个C语言程序
让我们从编写第一个C语言程序开始:
#include <stdio.h>int main()
{printf("hello world\n");printf("he he\n");return 0;
}
这段代码中:
- #include <stdio.h> 是一个预处理指令,用于包含标准输入输出库
- main函数是程序的入口点,每个C程序必须有且只有一个main函数
- printf 用于在屏幕上显示文本
- return 0 表示程序正常结束
数据类型
C语言提供了多种数据类型,用于表示不同种类的数据:
- char - 字符数据类型(1字节)
- short - 短整型(通常2字节)
- int - 整型(通常4字节)
- long - 长整型(至少4字节)
- long long - 更长的整型(至少8字节)
- float - 单精度浮点数(4字节)
- double - 双精度浮点数(8字节)
我们可以使用sizeof运算符查看各种数据类型的大小:
printf("%d\n", sizeof(char)); // 1
printf("%d\n", sizeof(short)); // 2
printf("%d\n", sizeof(int)); // 4
printf("%d\n", sizeof(long)); // 4或8(取决于系统)
printf("%d\n", sizeof(long long)); // 8
printf("%d\n", sizeof(float)); // 4
printf("%d\n", sizeof(double)); // 8
变量与常量
变量
变量是用于存储数据的命名空间。在C语言中,变量使用前必须先声明其类型:
char ch = 'w'; // 字符变量
int weight = 120; // 整型变量
float height = 175.5f; // 浮点变量
变量命名规则
- 变量名只能由字母(大小写)、数字和下划线组成 不能以数字开头
- 变量名长度不能超过63个字符
- 区分大小写
- 不能使用关键字作为变量名
变量的类型
- 局部变量:在函数内部定义,只在函数内部有效
- 全局变量:在函数外部定义,在整个程序中有效
当局部变量和全局变量同名时,局部变量优先使用。
变量的作用域和生命周期
作用域是变量可用的范围:
- 局部变量的作用域是其所在的局部范围
- 全局变量的作用域是整个程序
生命周期是变量从创建到销毁的时间段:
- 局部变量的生命周期:进入作用域开始,出作用域结束
- 全局变量的生命周期:整个程序的运行期间
常量
常量是程序运行过程中不能被修改的值。C语言中的常量有以下几种:
- 字面常量:直接的值,如 3.14、100
- const修饰的常变量:
const float PI = 3.14f; // PI不能被修改
- #define定义的标识符常量:
#define MAX 100
- 枚举常量
enum Sex {MALE, // 0FEMALE, // 1SECRET // 2
};
字符串、转义字符和注释
字符串
字符串是由双引号引起来的一串字符:
"hello world\n"
字符串以\0(空字符)结尾,这个空字符是字符串的结束标志,不计入字符串长度。
char arr1[] = "bit"; // 包含隐式的\0
char arr2[] = {'b', 'i', 't'}; // 没有\0,可能导致错误
char arr3[] = {'b', 'i', 't', '\0'}; // 显式添加\0
转义字符
转义字符用于表示特殊字符,如:
- \ - 反斜杠
- ’ - 单引号
- " - 双引号
- \n - 换行符
- \t - 水平制表符
- \r - 回车符
- \a - 警告字符(蜂鸣)
例如,如果要打印路径 c:\code\test.c,需要使用转义字符:
printf("c:\\code\\test.c\n");
注释
注释用于解释代码,但不会被编译器执行。C语言有两种注释风格:
- C风格注释:/* 注释内容 */(不能嵌套)
- C++风格注释:// 注释内容(可以注释一行或多行)
/* C风格注释,可以跨多行 */// C++风格注释,只能注释到行尾
选择语句
选择语句用于根据条件执行不同的代码:
#include <stdio.h>
int main()
{int coding = 0;printf("你会(选择1 or 0):>");scanf("%d", &coding);if(coding == 1){printf("11111\n");}else{printf("00000\n");}return 0;
}
循环语句
循环语句用于重复执行某段代码:
while循环
#include <stdio.h>
int main()
{printf("while\n");int line = 0;while(line <= 20000){line++;printf("%d\n",line);}if(line > 20000)printf("%d\n",line);return 0;
}
C语言还有其他循环结构如for循环和do-while循环,将在后续进阶中介绍。
函数
函数是执行特定任务的代码块,可以提高代码的复用性:
#include <stdio.h>// 函数声明和定义
int Add(int x, int y)
{int z = x + y;return z;
}int main()
{int num1 = 0;int num2 = 0;int sum = 0;printf("输入两个操作数:>");scanf("%d %d", &num1, &num2);sum = Add(num1, num2);printf("sum = %d\n", sum);return 0;
}
数组
数组是相同类型元素的集合:
int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; // 定义一个包含10个整数的数组
数组元素通过下标访问,下标从0开始:
#include <stdio.h>
int main()
{int i = 0;int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};for(i = 0; i < 10; i++){printf("%d ", arr[i]);}printf("\n");return 0;
}
操作符
C语言提供了丰富的操作符:
- 算术操作符:+, -, *, /, %
- 移位操作符:>>, <<
- 位操作符:&, |, ^, ~
- 赋值操作符:=, +=, -=, *=, /=, &=, |=, ^=, >>=, <<=
- 单目操作符:!, -, +, &, sizeof, ~, --, ++, *, (类型)
- 关系操作符:>, >=, <, <=, !=, ==
- 逻辑操作符:&&, ||
- 条件操作符:exp1 ? exp2 : exp3
- 逗号表达式:exp1, exp2, exp3, …
- 下标、函数调用和结构成员操作符:[], (), ., ->
常见关键字
C语言提供了多种关键字,如:auto, break, case, char, const, continue, default, do, double, else, enum, extern, float, for, goto, if, int, long, register, return, short, signed, sizeof, static, struct, switch, typedef, union, unsigned, void, volatile, while。
typedef关键字
typedef unsigned int uint_32; // 为unsigned int创建别名uint_32int main()
{unsigned int num1 = 0;uint_32 num2 = 0; // num1和num2类型相同return 0;
}
static关键字
static用于修饰变量和函数:
- 修饰局部变量:
延长局部变量的生命周期,使其在函数调用结束后仍然存在
void test()
{static int i = 0; // 静态局部变量i++;printf("%d ", i);
}
- 修饰全局变量:
限制全局变量的作用域,使其只能在当前源文件中使用 - 修饰函数:
限制函数的作用域,使其只能在当前源文件中使用
define定义常量和宏
#define可以用来定义常量和宏
// 定义常量
#define MAX 1000// 定义宏
#define ADD(x, y) ((x)+(y))int main()
{int sum = ADD(2, 3); // 展开为 ((2)+(3))printf("sum = %d\n", sum);sum = 10 * ADD(2, 3); // 展开为 10 * ((2)+(3))printf("sum = %d\n", sum);return 0;
}
指针
内存基础
内存被划分为一个个字节大小的单元,每个内存单元都有一个地址。我们可以使用取地址操作符&获取变量的地址:
int num = 10;
printf("%p\n", &num); // 打印num的地址
指针变量
指针是用于存储地址的变量:
int num = 10;
int *p = # // p是指向num的指针
*p = 20; // 通过指针修改num的值
printf("%d\n", num); // 输出20
指针的大小
在32位系统上,指针大小为4字节;在64位系统上,指针大小为8字节:
printf("%d\n", sizeof(char *)); // 4 (32位系统) 或 8 (64位系统)
printf("%d\n", sizeof(int *)); // 4 (32位系统) 或 8 (64位系统)
printf("%d\n", sizeof(double *)); // 4 (32位系统) 或 8 (64位系统)
结构体
结构体用于组合不同类型的数据:
// 定义学生结构体
struct Stu
{char name[20]; // 名字int age; // 年龄char sex[5]; // 性别char id[15]; // 学号
};int main()
{// 初始化结构体struct Stu s = {"张三", 20, "男", "20180101"};// 使用.访问结构体成员printf("name = %s age = %d sex = %s id = %s\n", s.name, s.age, s.sex, s.id);// 使用->通过指针访问结构体成员struct Stu *ps = &s;printf("name = %s age = %d sex = %s id = %s\n", ps->name, ps->age, ps->sex, ps->id);return 0;
}
总结
本文介绍了C语言的基础知识,包括数据类型、变量与常量、字符串、操作符、控制语句、函数、数组、指针和结构体等内容。这些知识点为初学者提供了入门C语言的基础。随着学习的深入,你将能够编写更复杂、更实用的C程序。
记住,编程需要大量的实践。不断练习编写代码,遇到问题时查阅资料,这样才能真正掌握C语言编程。祝你学习顺利!
