☰
C 语言学习笔记
2026/10/11 5:32:19 网站建设 项目流程

一、变量

变量是程序中用于存储数据的命名内存空间。在 C 语言中,使用变量前必须先声明其类型,编译器根据类型为变量分配内存空间。

1. 基本数据类型

C 语言提供了多种基本数据类型,主要包括整型、浮点型和字符型:

类型关键字大小(通常)取值范围
整型int4 字节-2147483648 ~ 2147483647
短整型short2 字节-32768 ~ 32767
长整型long4/8 字节取决于平台
单精度浮点型float4 字节约 ±3.4e38
双精度浮点型double8 字节约 ±1.7e308
字符型char1 字节-128 ~ 127
无符号整型unsigned int4 字节0 ~ 4294967295
#include<stdio.h>intmain(){intage=25;// 整型floatprice=99.5;// 单精度浮点型doublepi=3.14159;// 双精度浮点型chargrade='A';// 字符型unsignedintcount=100;// 无符号整型

2. 变量的声明与赋值

变量必须先声明后使用。声明时指定类型,赋值时存入数据。C 语言支持在声明的同时初始化变量。

#include<stdio.h>intmain(){intnum;// 声明变量num=10;// 赋值num=20;// 修改变量的值inta=5,b=3;// 同时声明并初始化多个变量charch='A';// 字符变量// 类型转换doubleresult=(double)a/b;// 强制转换为浮点除法intsum=a+b;// 整型运算

3. 变量的作用域

C 语言中变量按作用域分为局部变量和全局变量:

  • 局部变量:定义在函数内部,只能在函数内访问,函数结束后自动销毁。
  • 全局变量:定义在函数外部,整个程序都可以访问,程序结束才销毁。
  • 静态变量:使用static修饰,函数结束后仍保留其值。
#include<stdio.h>intglobal=100;// 全局变量voidcounter(){staticintcount=0;// 静态变量,只初始化一次count++;printf("第 %d 次调用\n",count);}intmain(){intlocal=10;// 局部变量printf("全局变量:%d\n",global);printf("局部变量:%d\n",local);counter();counter();counter();return0;}

二、输入输出函数

C 语言通过标准库函数实现数据的输入与输出,最常用的是printf和scanf,它们定义在<stdio.h>头文件中。

1. 输出函数 printf

printf用于格式化输出,通过格式说明符控制输出格式:

格式符含义示例
%d十进制整数printf("%d", 10);
%f浮点数printf("%.2f", 3.14);
%c单个字符printf("%c", 'A');
%s字符串printf("%s", "Hello");
%x十六进制printf("%x", 255);
%p指针地址printf("%p", &num);
%zu无符号大小printf("%zu", sizeof(int));
#include<stdio.h>intmain(){intage=25;floatscore=89.5;charname[]="张三";inthex=255;printf("姓名:%s\n",name);printf("年龄:%d\n",age);printf("成绩:%.1f\n",score);// 保留 1 位小数printf("成绩:%8.2f\n",score);// 宽度 8,保留 2 位小数printf("255 的十六进制:%x\n",hex);// ffprintf("255 的八进制:%o\n",hex);// 377return0;}

2. 输入函数 scanf

scanf用于从键盘读取输入,注意变量前必须加&取地址符(字符串除外):

#include<stdio.h>intmain(){intage;floatscore;charname[50];printf("请输入姓名:");scanf("%s",name);// 字符串不需要 &,且不能含空格printf("请输入年龄:");scanf("%d",&age);printf("请输入成绩:");scanf("%f",&score);printf("姓名:%s,年龄:%d,成绩:%.1f\n",name,age,score);return0;}

3. 字符输入输出 getchar 与 putchar

getchar用于从键盘读取单个字符,putchar用于向屏幕输出单个字符:

#include<stdio.h>intmain(){charch;printf("请输入一个字符:");ch=getchar();// 读取单个字符putchar(ch);// 输出单个字符printf("\n该字符的 ASCII 码是:%d\n",ch);return0;}

4. 字符串输入输出 fgets 与 puts

fgets用于安全地读取一行字符串(可包含空格),puts用于输出字符串并自动换行:

#include<stdio.h>intmain(){charline[100];printf("请输入一行文字(可包含空格):");fgets(line,sizeof(line),stdin);// 读取一行,最多 99 个字符printf("你输入的是:");puts(line);// 输出字符串并自动换行// 注意:fgets 会保留换行符,可手动去除printf("去除换行符后:");line[strcspn(line,"\n")]='\0';// 去掉末尾的换行符puts(line);return0;}
  • fgets(数组名, 最大长度, stdin)会读取包括空格在内的一整行,并自动在末尾补\0。
  • 与scanf("%s")不同,fgets能读取含空格的字符串,更安全(不会越界)。
  • puts(字符串)输出后自动换行,比printf("%s\n", ...)更简洁。
  • 使用strcspn可以去掉fgets读入时保留的换行符。

三、常量

常量是在程序运行过程中值不能改变的量。C 语言中定义常量有两种方式:宏定义和const关键字。

1. 宏定义常量(#define)

宏定义在预处理阶段完成替换,不占用内存空间,常用于定义数值常量和简单表达式:

#include<stdio.h>#definePI3.14159// 定义圆周率#defineMAX_SIZE100// 定义数组大小#defineSQUARE(x)((x)*(x))// 宏函数intmain(){constintMAX=100;// const 常量intnum=10;num=20;// 变量可以修改// MAX = 200; // 错误!常量不可修改printf("PI = %.5f\n",PI);printf("MAX = %d\n",MAX);printf("SQUARE(5) = %d\n",SQUARE(5));printf("num = %d\n",num);return0;}

2. const 关键字

const修饰的变量在编译阶段检查,具有类型,更安全:

#include<stdio.h>intmain(){constdoubleTAX_RATE=0.13;// 税率常量constintDAYS_PER_WEEK=7;doubleprice=100.0;doubletax=price*TAX_RATE;printf("商品价格:%.2f\n",price);printf("税率:%.2f%%\n",TAX_RATE*100);printf("税额:%.2f\n",tax);printf("一周有 %d 天\n",DAYS_PER_WEEK);return0;}

3. 宏定义与 const 的区别

对比项#defineconst
处理阶段预处理(编译前)编译阶段
类型检查无有
占用内存不占用占用
作用域从定义到文件结束遵循块作用域
调试支持不支持支持

四、运算符

运算符用于对数据进行运算。C 语言提供了丰富的运算符,包括算术、关系、逻辑、赋值和位运算符。

1. 算术运算符

#include<stdio.h>intmain(){inta=10,b=3;// 算术运算符printf("加法:%d\n",a+b);// 13printf("减法:%d\n",a-b);// 7printf("乘法:%d\n",a*b);// 30printf("除法:%d\n",a/b);// 3(整数除法,舍去小数)printf("取余:%d\n",a%b);// 1printf("自增:%d\n",++a);// 11(先自增再使用)printf("自减:%d\n",--b);// 2(先自减再使用)// 浮点除法doublec=10.0,d=3.0;printf("浮点除法:%.2f\n",c/d);// 3.33return0;}

2. 关系与逻辑运算符

#include<stdio.h>intmain(){inta=10,b=3;// 关系运算符(结果为 1 真 或 0 假)printf("a > b:%d\n",a>b);// 1(真)printf("a < b:%d\n",a<b);// 0(假)printf("a == b:%d\n",a==b);// 0(假)printf("a != b:%d\n",a!=b);// 1(真)// 逻辑运算符printf("a > 5 && b < 5:%d\n",a>5&&b<5);// 1(与)printf("a > 5 || b > 5:%d\n",a>5||b>5);// 1(或)printf("!(a > b):%d\n",!(a>b));// 0(非)return0;}

3. 赋值与复合赋值运算符

#include<stdio.h>intmain(){intx=10;x+=5;// 等价于 x = x + 5,x = 15printf("x += 5:%d\n",x);x-=3;// x = 12printf("x -= 3:%d\n",x);x*=2;// x = 24printf("x *= 2:%d\n",x);x/=4;// x = 6printf("x /= 4:%d\n",x);x%=4;// x = 2printf("x %%= 4:%d\n",x);return0;}

4. 位运算符

#include<stdio.h>intmain(){unsignedchara=0b1100;// 12unsignedcharb=0b1010;// 10printf("a & b = %d\n",a&b);// 按位与:8printf("a | b = %d\n",a|b);// 按位或:14printf("a ^ b = %d\n",a^b);// 按位异或:6printf("~a = %d\n",~a);// 按位取反printf("a << 1 = %d\n",a<<1);// 左移 1 位:24printf("a >> 1 = %d\n",a>>1);// 右移 1 位:6return0;}

5. 运算符优先级

优先级运算符结合性
高()[]->.左到右
!~++---*&右到左
*/%左到右
+-左到右
<<>>左到右
<<=>>=左到右
==!=左到右
&&左到右
||左到右
低=+=-=等右到左

六、循环结构

循环结构用于重复执行一段代码,是程序设计中最重要的控制结构之一。在实际开发中,我们经常需要反复执行某些操作,比如遍历数组、累加求和、处理用户输入等,如果逐行编写重复代码不仅繁琐,而且难以维护。循环结构正是为了解决这类问题而设计的。

C 语言提供for、while和do-while三种循环,它们各有特点,适用于不同的场景:

  • for循环:适用于循环次数已知的情况。它将初始化、条件判断和步进更新集中在一行,结构清晰,是使用最频繁的循环。
  • while循环:适用于循环次数不确定、仅依赖某个条件的情况。它先判断条件再执行循环体,条件不满足时循环体一次都不会执行。
  • do-while循环:与while类似,但先执行一次循环体再判断条件,因此循环体至少会执行一次,适合"先做后判断"的场景。

三种循环在功能上可以相互转换,但选择合适的循环类型能让代码更易读、更符合逻辑。下面通过一个综合示例来演示三种循环的用法:

#include<stdio.h>intmain(){// for 循环for(inti=1;i<=5;i++){printf("for 循环:%d\n",i);}// while 循环intj=1;while(j<=5){printf("while 循环:%d\n",j);j++;}// do-while 循环intk=1;do{printf("do-while 循环:%d\n",k);k++;}while(k<=5);return0;}

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询