哈哈哈哈哈,终于想起来了!贴一下主要的参考:
基本语法 - 《阮一峰《C 语言教程》》 - 书栈网 · BookStack
内容写的比较浅显有疏漏,如果看不明白,再结合一下百度。
注释
C 语言的注释有两种表示方法。
第一种方法是将注释放在/*...*/
之间,可以一行,也可以在内部分行。
/* 注释一行 */
/*
注释分行
*/
灵活的运用方式----------在文件头部进行文件的版权或者功能解说:
/*****************************************\
|* Copyright (c) 2024 by 777 *|
|* All Rights Reserved. *|
|* *|
\*****************************************/
第二种写法是将注释放在双斜杠//
后面,从双斜杠到行尾都属于注释。这种注释只能是单行,可以放在行首,也可以放在一行语句的结尾。
可以放在代码块的上一行进行代码作用的解释,或者临时注释掉不用的代码行,进行后续debug .
if (0 == r && 0 == b)
C 语言中 进行比较的表达式,称为"关系表达式",里面使用的运算符就称为"关系运算符",主要有下面6个。
>
大于运算符a > b;
<
小于运算符a < b;
>=
大于等于运算符a >= b;
<=
小于等于运算符a <= b;
==
相等运算符a == b;
!=
不相等运算符a != b;
关系表达式通常返回0
或1
,表示真伪。
C 语言中,0
表示伪,所有非零值表示真。比如,20 > 12
返回1
,12 > 20
返回0
。
关系表达式常用于if
或while
结构。比如:
if (x == 3) {
printf("x is 3.\n");
}
注意,相等运算符 ==
与赋值运算符 =
是两个不一样的运算符。如果不小心写出下面的代码,它可以运行,但很容易出现意料之外的结果。
if (x = 3) ...
上面示例中,原意是x == 3
,但是不小心写成x = 3
。这个式子表示对变量x
赋值3
,它的返回值为3
,所以if
判断总是为真。
为了防止出现这种错误,有的程序员喜欢将变量写在等号的右边。
- if (3 == x)
...
这样的话,如果把==
误写成=
,编译器就会报错。
/* 报错 */
if (3 = x) ...
switch
switch 语句用于判断条件有多个结果的情况。
switch (expression) {
case value1: statement
case value2: statement
default: statement
}
上面代码中,根据表达式data->bitwidth不同的值,执行相应的case
分支。如果找不到对应的值,就执行default
分支。
每个case
语句体的结尾,都应该有一个break
语句,作用是跳出整个switch
结构,不再往下执行。如果缺少break
,就会导致继续执行下一个case
或default
分支。
switch (grade) {
case 0:
printf("False");
case 1:
printf("True");
break;
default:
printf("Illegal");
}
上面示例中,case 0
的部分没有break
语句,导致这个分支执行完以后,不会跳出switch
结构,继续执行case 1
分支。
利用这个特点,如果多个case
分支对应同样的执行语句体,可以写成下面这样。
switch (grade) {
case 0:
case 1:
printf("True");
break;
default:
printf("Illegal");
}
上面示例中,case 0
分支没有任何语句,导致case 0
和case 1
都会执行同样的语句体。
case
后面的语句体,如果比较复杂,建议(但不必须)放在大括号里面。这也是为什么需要break跳出switch的原因
。
default 分支是可选的,用来处理前面的 case 都不匹配的情况,最好放在所有 case 的后面。如果没有该分支,遇到所有的 case 都不匹配的情况,就会直接跳出整个 switch 代码块。
while 和 do ... while
实际中用的少,更多用的是 for 循环 ,比如 for (uint8_t i = 10; i < 40; i++)
while
语句用于循环结构,满足条件时,不断执行循环体。
while (expression)
statement
do...while
结构是while
的变体,它会先执行一次循环体,然后再判断是否满足条件。如果满足的话,就继续执行循环体,否则跳出循环。
do statement
while (expression);
continue 语句
continue
关键字在 C 语言中用于跳过当前循环中的剩余代码,并立即开始下一次迭代。
详细可以参考:【C语言】continue 关键字详解_c语言continue-CSDN博客
char
C 语言中基本数据类型有三种:字符(char)、整数(int)和浮点数(float)
char c = 'B';
上面示例声明了变量c
是字符类型,并将其赋值为字母B
。字符常量必须放在单引号 ''里面。
字符数组
字符数组是一个可以存储多个字符的连续内存区域。这些字符可以是文本字符串的一部分,或者用于其他目的。字符数组在声明时指定了大小(即可以存储的字符数),并在栈上分配内存。
示例:
- char str[10]; // 声明一个可以存储最多9个字符和1个空字符('\0')的字符数组
- strcpy(str, "Hello"); // 使用strcpy函数将字符串"Hello"复制到str数组中
在上面的示例中,str是一个字符数组,它可以存储最多10个字符。我们使用strcpy函数将一个字符串复制到这个数组中。
声明时,如果预先知道字符数组的长度,那么可以在声明时将长度值写在中括号中;如果声明时并不知道该字符数组的数据长度,那么则可用不预先声明字符数组长度,即将中括号置空。
字符数组变量的赋值形式也有两种:
-
用花括号扩起来的字符数组赋值,必须注意用结束符\0作为字符数组的最后一个字符;
-
使用双引号扩起来的字符串赋值。
char arr[] = "abc";
char arr2 [4] = {'a', 'b', 'c', '\0' };
char arr[3][10] = {"hello", "world", "c"};
float minD = 65535.0f;
将整数65535赋值给浮点变量minD.
浮点型是基本数据类型之一,用于定义实数(小数)变量。
float
(单精度浮点数)类型占用4个字节(32位),其中8位存放指数的值和符号,剩下24位存放小数的值和符号。float
类型至少能够提供(十进制的)6位有效数字,指数部分的范围为(十进制的)-37
到37
,即数值范围为到。
有时候,32位浮点数提供的精度或者数值范围还不够,C 语言又提供了另外两种更大的浮点数类型。
double
:占用8个字节(64位),至少提供13位有效数字。-----(双精度浮点数)long double
:通常占用16个字节。
举例:
float f = 1.23f; // 定义单精度浮点型变量f,值为1.23,
double d = 1.23; // 定义双精度浮点型变量d,值为1.23,
解释:在C语言中浮点数常量模式是 double类型的。如果需要直接使用float 型的浮点数,需要在常数后面加后缀f。
如果是声明变量,则在赋值时不必要加f 后缀。
bool值,true or false
头文件stdbool.h
定义了另一个类型别名bool
,并且定义了true
代表1
、false
代表0
。只要加载这个头文件,就可以使用这几个关键字。
#include <stdbool.h>
bool flag = false;