C语言第一次培训笔记

目录

一、C程序的基本代码框架

#include <stdio.h>  

int main()
{
	printf("hello world\n");
    return 0;
}
  • #include <stdio.h>:引入标准输入输出库,使用 printf 和 scanf 时需要它
  • main:程序开始执行的函数,可以把它理解为程序入口
  • {}:表示代码块
  • return 0;:表示程序正常结束
  • 每条语句通常以分号 ; 结束

二、注释

C语言有两种注释方法:

// 单行注释

/*
	多行注释
	一般在自行定义的函数前有使用多行注释详细说明函数作用
*/

/* 这个注释也可以在同一行中 */

二、基本数据类型

1. 常用类型

类型大小(字节)范围格式符
char1-128 到 127%c
unsigned char10 到 255%c
int4-2,147,483,648 到 2,147,483,647%d
unsigned int40 到 4,294,967,295%u
short2-32,768 到 32,767%hd
long8很大的范围%ld
float46位精度%f
double815位精度%lf

补充说明:具体字节数与编译环境有关。可以用 sizeof 查看大小:

#include <stdio.h>

int main(void)
{
    printf("int: %zu bytes\n", sizeof(int));
    printf("float: %zu bytes\n", sizeof(float));
    printf("double: %zu bytes\n", sizeof(double));
    printf("char: %zu byte\n", sizeof(char));
    return 0;
}

2. 位、字节、二进制和十六进制

  • 1 个字节通常由 8 个位组成
  • 二进制适合表示每一位的 0/1 状态
  • 后续单片机中的寄存器等读写操作经常需要用位和位运算的概念

3. 变量、声明、初始化和赋值

int count;       // 声明变量
int voltage = 5; // 声明并初始化

count = 10;      // 赋值
count = count + 1;
  • 声明:说明变量的类型和名字
  • 初始化:变量第一次获得值
  • 赋值:把一个新值放入已经存在的变量
  • 变量的值可以改变,变量的类型通常在声明后不变

4. 类型转换

int a = 5;
int b = 2;
printf("%d\n", a / b);              // 结果为 2
printf("%f\n", (float)a / b);     // 结果为 2.500000
  • 两个整数相除,结果仍按整数处理,小数部分会被舍去
  • 需要小数结果时,应使用 float 或 double,或进行类型转换
  • 变量超过可表示范围时可能发生溢出

三、变量的作用域和常量

1. 局部变量和全局变量

  • 在函数外声明的是全局变量,作用范围较大
  • 在函数内部声明的是局部变量,只能在相应代码块中使用
#include <stdio.h>

int global_value = 10;

int main(void)
{
    int local_value = 5;
    printf("%d %d\n", global_value, local_value);
    return 0;
}

2. 常量


#define PI 3.1415926

const int MAX_VALUE = 1024;
  • #define 是预处理阶段的文本替换
  • const 声明一个程序运行期间不应被修改的变量

四、输出和输入

1. printf

#include <stdio.h>

int main(void)
{
    int count = 10;
    float voltage = 3.3f;
    char grade = 'A';

    printf("count = %d\n", count);
    printf("voltage = %.2f V\n", voltage);
    printf("grade = %c\n", grade);
    return 0;
}

常用格式说明符(占位符):

  • %d:int
  • %c:char
  • %f:输出浮点数
  • %lld:long long
  • %.2f:保留两位小数
  • \n:换行

2. scanf

#include <stdio.h>

int main(void)
{
    int a, b;
    printf("请输入两个整数:");
    scanf("%d %d", &a, &b);
    printf("和为:%d\n", a + b);
    return 0;
}
  • scanf 用于从输入中读取数据
  • &a 表示取得变量 a 的地址;本次先记住这种写法,指针会在后续课程详细解释
  • 输入格式符必须与变量类型相匹配

五、运算符

1. 算术运算符

+、-、*、/、%

int a = 7;
int b = 3;
printf("%d\n", a + b);
printf("%d\n", a - b);
printf("%d\n", a * b);
printf("%d\n", a / b);
printf("%d\n", a % b); // 求余数

2. 关系运算符

>、<、>=、<=、==、!=

  • 结果为真或假(用0来表示假,非0表示真)
  • 特别提醒:== 用于比较,= 用于赋值。

3. 逻辑运算符

&&(并且)、||(或者)、!(取反)

4. 自增、自减和复合赋值

++、--、+=、-=、*=、/=

++a 和 a++ 都会让 a 增加 1,但返回值不同:

  • ++a:先自增,再使用新值(前置自增)
  • a++:先使用原值,再自增(后置自增)

a += 1 : a = a + 1 a -= 1 : a = a - 1

5. 运算优先级

表达式较复杂时使用括号明确意图:

int result = (a + b) * c;

六、分支结构

导入:

在了解分支结构之前,我们需要了解一下什么是顺序结构
  • 顺序结构的特点:==从上往下依次执行==,这也是程序默认的执行过程。
#include <stdio.h>

int main()
{
	int a; 
	scanf("%d", &a);  // <-如果没有输入,则程序就会卡在这里
	/* 其他代码 */
	return 0;
}

分支结构的特点:

  • 从上往下依次判断
  • 只要有一个判断成立,则就执行对应的语句体
  • 如果都不成立,就执行else里面的语句体

1. if

if(判断条件)
{
	/* 满足条件执行程序 */
}

// 如果所执行的程序只有一行,我们可以这么写:
if(判断条件) /* 满足条件执行的程序 */
if (voltage > 5.0)
{
    printf("电压偏高\n");
}

2. if - else

if (voltage > 5.0)  
{  
    printf("电压偏高\n");  
}  
else  
{  
    printf("电压可接受\n");  
}

3. 多分支判断

多分支判断逻辑图

C语言使用 else if 表示多个条件:

if(关系语句A)
{
	满足A执行的程序
}
else if(关系语句B)
{
	满足B执行的程序
}
else if(关系语句C)
{
	满足C执行的程序
}
......
else
{
	满足N所执行的程序
}
if (score >= 90)
{
    printf("优秀\n");
}
else if (score >= 60)
{
    printf("及格\n");
}
else
{
    printf("需要继续学习\n");
}

4. switch

switch逻辑图


switch (表达式)
{
	case 值1:
	    语句体1;
	    break;
	case 值2:
	    语句体2;
	    break;
	case 值3:
		语句体3;
		break;
	.....
	default:
	    未匹配的语句体;
	    break;
}
  • switch 适合判断一个变量的多个固定值
  • break 用于结束当前分支,避免继续执行后面的分支
  • default 处理未匹配的情况,这个是可选的
  • case 整型常量或字符常量

七、循环语句

1. for

  • 适合循环次数较明确的情况
for(判断变量初始化; 判断条件; 变量更新)
{
	循环体;
}
int n;  
printf("输出次数:");  
scanf("%d", &n);  
for (int i = 0; i < n; i++)  
{  
    printf("第 %d 次输出\n", i + 1);  
}

循环嵌套:

printf("九九乘法表\n");  
for(int i = 1; i<= 9; i++)  
{  
   for(int j = 1; j<=i; j++)  
   {  
       printf("%d*%d=%d\t", j, i, i*j);  
   }  
   printf("\n");  
}

2. while

  • 适合用在不知道循环的次数和范围,只知道循环的结束条件

while逻辑图

while(条件判断语句)
{
	循环体语句;
	变量更新;
}
int count = 0;
while (count < 5)
{
    printf("count = %d\n", count);
    count ++;
}
  • 适用于未知循环次数,但知道循环条件的情况:比如质数的寻找、字符串的遍历

3. do - while

int value;
do
{
    printf("请输入一个正数:");
    scanf("%d", &value);
}
while (value > 0);
  • 循环体至少执行一次
  • 先执行再判断条件

4. break 和 continue

  • break:立即结束整个循环
  • continue:跳过本次循环剩余部分,进入下一次循环

常见报错

  • 漏写分号:expected ';'
  • 字符串没有使用英文双引号 "
  • 字符没有使用英文单引号 '
  • 使用了未声明的变量
  • 一直没有输出:可能卡死在某个循环中无法

说明: 1. 阅读报错时,先看报错所在的行号,再看报错信息,最后结合上一行检查括号和分号。报错行有时只是编译器发现问题的位置,真正原因可能在前一行。 2. 遇到不懂的问题可以将报错信息问学长学姐或者去自行搜索(AI或者浏览器搜索) 3. 遇到错误一定要记得记录,无论是C语言还是后面的单片机语言都要养成记录错误的习惯