前言: 在踏入C语言编程的奇妙旅程之初,掌握基本语句无疑是我们搭建知识大厦的坚实基石。C语言,作为一门历史悠久且功能强大的编程语言,其简洁明了的语法结构为我们提供了表达逻辑、控制程序流程的强大工具。而基本语句,正是这些工具中的基础与核心。
本篇文章旨在引领初学者走进C语言基本语句的世界,通过深入浅出的讲解和实例演示,帮助大家理解并掌握这些语句的用法。我们将从最基本的赋值语句开始,逐步深入到条件判断、循环控制等关键语句,让每一位读者都能清晰地感受到C语言编程的魅力与力量
让我们一同踏上这段充满挑战与收获的C语言编程之旅吧!
📒1. 选择语句与循环语句
🍁选择语句
C语言中的选择语句主要用于基于不同条件执行不同的代码块。C语言中主要有两种选择语句:if语句和switch语句
选择语句流程图
开始表达式语句一结束语句二yesno
选择语句代码示例
int main() { int n = 0; printf("你会去敲代码吗?(选择1 or 0):>"); scanf("%d", &n); if(n == 1) { prinf("坚持,你会有好offer\n"); } else { printf("放弃,回家卖红薯\n"); } return 0; }
🍂循环语句
C语言中的循环语句允许我们重复执行一段代码多次,直到满足某个条件为止。
C语言的循环结构实现的三种方式:
- while语句
- for语句
- do … while语句
循环语句流程图
开始买彩票走向成功老实学习yesnoyesno
循环语句代码示例(while循环)
// while循环 int main() { printf("努力学习\n"); int line = 0; while (line <= 20000) { line++; printf("我要继续努力敲代码\n"); } if (line > 20000) printf("好offer\n"); return 0; }
注意:剩下的没讲的内容会在后续的专题讲解
📙2. 函数
C语言中的函数是执行特定任务的独立代码块。函数允许你将代码组织成可重用的单元,这有助于使程序更加模块化、易于理解和维护。函数可以接受输入(称为参数)并可以返回输出(称为返回值)
场景分析
// 在一般的时候,我们让两个数相加就会用以下方法 // 当时当我们要多次使用时,就会冗余,降低代码可读性 // 为了能够实现功能复用,我们通常会使用函数来定义这个加法方式 int main() { int num1 = 0; int num2 = 0; int sum = 0; printf("输入两个操作数:>"); scanf("%d %d", &num1, &num2); sum = num1 + num2; printf("sum = %d\n", sum); return 0; }
函数代码示例
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; }
函数的特点就是简化代码,代码复用,关于函数先介绍这么多,让我们进入下一环节
📜3. 数组
C语言中的数组是一种基本的数据结构,它允许你存储相同类型的数据项集合。在数组中,每个数据项(也称为元素)可以通过索引来访问,索引通常是一个整数,用于指定元素的位置。数组中的索引是从0开始的,这意味着第一个元素的索引是0,第二个元素的索引是1,依此类推
注意:
- 数组的大小在编译时是固定的,不能动态改变
- 数组索引越界是C语言中常见的错误之一,它可能导致未定义行为,包括程序崩溃
- 数组名在表达式中通常被当作指向数组第一个元素的指针,但在数组定义和数组大小表达式中除外
⛰️数组定义
数组的定义包括指定数组的类型、数组的名称以及数组中元素的数量(即数组的大小)。数组的大小在定义时必须是一个常量表达式,不能是变量
type arrayName[size]; int arr[10] = {1,2,3,4,5,6,7,8,9,10};//定义一个整形数组,最多放10个元素
- type 是数组中元素的类型(如 int、float、char 等)。
- arrayName 是数组的名称。
- size 是数组中元素的数量。
🏞️数组下标
C语言规定:数组的每个元素都有一个下标,下标是从0开始的
数组可以通过下标来访问的
int arr[10] = {0}; //如果数组10个元素,下标的范围是0-9
🌄数组使用
数组遍历代码演示
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; }
📚4. 操作符,常见关键字与 #define
🌞操作符
操作符简单介绍为主,后面课件重点讲
类型 | 操作符 |
算术操作符 | + - * / % |
移位操作符 | >> << |
位操作符 | & ^ | |
赋值操作符 | = += -= *= /= &= ^= |
单目操作符
操作符 | 功能 |
! | 逻辑反操作 |
- | 负值 |
+ | 正值 |
& | 取地址 |
sizeof | 操作数的类型长度(以字节为单位) |
~ | 对一个数的二进制按位取反 |
-- | 前置、后置-- |
++ | 前置、后置++ |
* | 间接访问操作符(解引用操作符) |
(类型) | 强制类型转换 |
关系操作符
操作符 | 功能 |
> | 大于 |
>= | 不小于 |
< | 小于 |
<= | 不大于 |
!= | 不等于 |
== | 相等 |
逻辑操作符
操作符 | 功能 |
&& | 逻辑与 |
|| | 逻辑或 |
条件操作符
exp1 ? exp2 : exp3
逗号表达式
exp1, exp2, exp3, …expN
注意:逗号表达式会取最后一个的值作为结果
下标引用、函数调用和结构成员
[] () . ->
🌙#define
//define定义标识符常量 #define MAX 1000 //define定义宏 #define ADD(x, y) ((x)+(y)) #include <stdio.h> int main() { int sum = ADD(2, 3); printf("sum = %d\n", sum); sum = 10*ADD(2, 3); printf("sum = %d\n", sum); return 0; }
⭐常见关键字
C语言提供了丰富的关键字,这些关键字都是语言本身预先设定好的,用户自己是不能创造关键字的
🌈关键字 typedef
typedef 顾名思义是类型定义,这里应该理解为类型重命名
//将unsigned int 重命名为uint_32, 所以uint_32也是一个类型名 typedef unsigned int uint_32; int main() { //观察num1和num2,这两个变量的类型是一样的 unsigned int num1 = 0; uint_32 num2 = 0; return 0; }
🌈关键字static
static是用来修饰变量和函数的
- 修饰局部变量-称为静态局部变量
- 修饰全局变量-称为静态全局变量
- 修饰函数-称为静态函数
修饰局部变量
void test() { //static修饰局部变量 static int i = 0; i++; printf("%d ", i); } int main() { int i = 0; for(i=0; i<10; i++) { test(); } return 0; }
static修饰局部变量改变了变量的生命周期,让静态局部变量出了作用域依然存在,到程序结束,生命周期才结束
修饰全局变量
//代码1 //add.c int g_val = 2018; //test.c int main() { printf("%d\n", g_val); return 0; } //代码2 //add.c static int g_val = 2018; //test.c int main() { printf("%d\n", g_val); return 0; }
一个全局变量被static修饰,使得这个全局变量只能在本源文件内使用,不能在其他源文件内使用,所以代码2在编译的时候会出现连接性错误
修饰函数
//代码1 //add.c int Add(int x, int y) { return c+y; } //test.c int main() { printf("%d\n", Add(2, 3)); return 0; } //代码2 //add.c static int Add(int x, int y) { return c+y; } //test.c int main() { printf("%d\n", Add(2, 3)); return 0; }
一个函数被static修饰,使得这个函数只能在本源文件内使用,不能在其他源文件内使用,所以代码2在编译的时候会出现连接性错误
📝5. 指针
C语言中的指针是C语言编程中一个非常核心且强大的特性。指针允许你直接访问内存地址,并操作这些地址中存储的数据。理解指针对于深入理解C语言以及后续学习更高级的语言(如C++、Java等)中的内存管理非常关键
🎩内存
内存是电脑上特别重要的存储器,计算机中程序的运行都是在内存中进行的
所以为了有效的使用内存,就把内存划分成一个个小的内存单元,每个内存单元的大小是1个字节
为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地址
变量是创建内存中的(在内存中分配空间的),每个内存单元都有地址,所以变量也是有地址的
取出变量地址代码示例
int main() { int num = 10; # // 取出num的地址 // 注:这里num的4个字节,每个字节都有地址 // 取出的是第一个字节的地址(较小的地址) printf("%p\n", &num);//打印地址,%p是以地址的形式打印 return 0; }
地址的存储,需要定义指针变量
int num = 10; int *p;//p为一个整形指针变量 p = #
指针代码示例
int main() { int num = 10; int *p = # *p = 20; return 0; }
注意:以整形指针举例,可以推广到其他类型
🎈指针变量的大小
//指针变量的大小取决于地址的大小 //32位平台下地址是32个bit位(即4个字节) //64位平台下地址是64个bit位(即8个字节) int main() { printf("%d\n", sizeof(char *)); printf("%d\n", sizeof(short *)); printf("%d\n", sizeof(int *)); printf("%d\n", sizeof(double *)); return 0; }
结论:指针大小在32位平台是4个字节,64位平台是8个字节
📘6. 结构体
结构体是C语言中特别重要的知识点,结构体使得C语言有能力描述复杂类型
比如描述学生,学生包含: 名字+年龄+性别+学号 这几项信息
结构体定义
struct Stu { char name[20];//名字 int age; //年龄 char sex[5]; //性别 char id[15]; //学号 };
结构体的初始化
//打印结构体信息 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);
📖7. 总结
在结束这篇关于介绍C语言基本语句的文章之际,我们不禁感慨于C语言那简洁而强大的魅力。从最基本的变量声明、数据类型到控制流语句如if-else、for循环、while循环,再到函数定义与调用,每一个基础语句都是构建复杂程序大厦的基石
通过学习和实践这些基本语句,我们不仅能够编写出解决简单问题的程序,更为后续深入学习C语言的高级特性,如指针、结构体、文件操作等打下了坚实的基础。C语言不仅仅是一种编程语言,它还是理解计算机底层工作原理、掌握内存管理、优化程序性能的一把钥匙
希望这篇文章能够成为你C语言学习之旅的一个良好起点,激发你对编程的无限热爱与探索欲。记住,编程之路虽长且艰!
希望本文能够为你提供有益的参考和启示,让我们一起在编程的道路上不断前行!
谢谢大家支持本篇到这里就结束了,祝大家天天开心!