语言基础篇:
C语言的基础语法(一)。
一、printf 程序输出,让计算机“说话”
printf() 输出函数,把程序中数据信息输出到屏幕上。
二、类型和变量,组织语言让计算机理解你的意思
将现实世界的“信息”,映射到计算机世界中的“数据”。如:
| 现实生活 | 计算机中 | 类型解释 |
|---|---|---|
| 这里有107家时髦的金拱门 | int | 整数类型 |
| 艾伦巨人身高15.3米 | float / double | 浮点数类型 |
| 我的名字叫Ada | char[] | 字符串类型 |
在程序中,我们把信息记录在变量里。变量是用来存储数据的。
类型和变量是两个完全不同的概念。
类型与其格式占位符之间的对应关系
#include <stdio.h>
int main() {
// 定义变量a,b
int a = 167, b = 543;
// 输出
printf("%d + %d = %d", a, b, a + b);
return 0;
}
// 输出:167 + 543 = 710
- 格式控制字符串:
%d + %d = %d,其中%d是整型的“格式占位符”。 - 参数列表:
a, b, a + b,每一项依次对应一个“格式占位符”要输出的内容。
| 格式占位符 | 作用 | 对应类型 |
|---|---|---|
%d | 十进制形式的整型数据 | int |
%f | 小数形式的浮点型数据 | float / double |
%s | 字符串数据 | char[] |
操作颜色的转义字符
设置颜色,以 \033 开始,也以 \033 结束。具体格式如下:
\033[属性代码{;属性代码...}m输出内容\033[0m
0代表关闭所有属性1代表高亮,粗体4代表下划线33代表换色
#include <stdio.h>
int main() {
printf("\033[1;4;33mhello color\033[0m");
return 0;
}
三、scanf 输入函数,让计算机“捡起”你的话
scanf() 输入函数,把用户输入的信息捡起来存储在变量中。
四、if...else... 给代码添加判断能力
如果……就……否则……
- 如果
if后面接假设条件 - 就
后面接条件
成立后的结果 - 否则
else接条件不成立后的结果
if...else...语法结构
if (条件表达式) 一条语句1;
else 一条语句2;
表达式的值,非 0 即为真。
一条语句
- 空语句
单纯以一个分号结尾,不存在任何实质上的操作。if (a == 3) ; - 单一语句
以分号结尾,比空语句多了语句内容。if (a == 3) printf("hello Ada!"); - 复合语句
被大括号包裹,中间是若干条语句。if (a == 3) { printf("hello One\n"); printf("hello Two\n"); printf("hello Three"); } - 结构语句
以if (a == 3) { if (a == 4) { printf("hello World!"); } }if,for,while等开头的分支语句或循环语句。
五、for 和 while 给程序添加重复执行功能
while 语句
while (循环条件) 一条语句;
以 while 关键字开头,后面跟着循环条件(一个条件表达式),然后是一条语句。
当循环条件成立时,就会执行一次后面的语句,之后就是再判断循环语句是否成立,如果成立就再执行,一直到循环条件不成立为止。
for 语句
for (初始化①; 循环条件②; 循环后操作③) 一条语句④;
for 语句会按照①②④③②④③...循环,知道某一次循环条件②不成立了为止。
①只在循环开始时执行了一次,真正的循环是以循环条件②,一条语句④以及循环后操作③组成的。
闰年的规则
- 能被4整除,但不能被100整除;
- 能被400整除。
// 闰年
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
// your code here...
}
六、随机函数
- 真随机 前后两次出现的数字是两次独立事件,没有任何关系。
- 伪随机 一旦上一个随机函数的值确定了,下一个数字也就确定了。
程序中的随机函数
计算机中随机函数的基本原理。
全是伪随机,根据上一个随机值和一个固定的计算规则,得到下一个随机值。
rand() 函数,获得一个随机值,将依次返回随机序列中的每一个值。
随机种子
在设置随机函数中记录的上一个随机值。
srand() 函数,设置随机种子,即设置随机过程中的第一个起始点的位置。
#include <stdio.h>
#include <stdlib.h>
# include <time.h>
int main() {
// 永远输出固定值
printf("%d\n", rand() % 1000);
// 设置随机种子
srand(time(0));
// 每次运行输出都不同
printf("%d\n", rand() % 1000);
return 0;
}
七、数组
数组,一组数据。规模化存储工具。
字节与地址:数据的住所和门牌号。
-
字节:计算机中最基本的存储单位,像一个个不可分割的小格子,存在于我们计算机的内存中。不同类型的元素占用的格子数量不一样。可以使用
sizeof()这个运算符来计算变量占用字节数量。想要查看什么元素或者类型所占用字节数量,就把什么传入
sizeof()即可。int a; // 计算变量a占用的字节数量 sizeof(a); // 计算一个整型元素占用的字节数量 sizeof(int);每一种基础类型,在内存中存储时,一定是占用若干个连续的存储单元。
字节是存储数据的基本单位,比特是表示信息的最基本单位。
一个比特就是一个二进制位,要么是
0,要么是1。1个字节等于8比特位。即:1 btye = 8 bit。 -
地址:每一个字节的唯一标记。内存地址采用
%p格式占位符进行输出。#include <stdio.h> int main() { int a; // 输入变量a的值 scanf("%d\n", &a); // 输出变量a的地址 printf("%p\n", &a); return 0; }单一的
&运算符放到变量前面,取到的就是这个变量的首地址。一个变量占用若干个字节。第一个字节的地址,就是这个变量的首地址。
在程序中,单独使用数组名字的时候,实际上就代表了整个数组的首地址,整个数组的首地址就是数组中第一个元素的首地址,即
arr[0]的地址。地址支持
+/-法,arr + 0等价于arr[0]的地址,arr + 1等价于arr[1]的地址。即:arr + i就等价于arr[i]的地址。
八、值和变量
变量:变化的量。
具体结果就是值,明确知道等于多少的就是值。存储这些值的地方,就是变量,就是在程序中用来指代某片存储空间的名称。值就是存储空间里面的具体内容。
九、字符串和字符数组
字符内容用单引号,字符串内容用双引号。
杠零字符
写作 \0,对于底层是一个很重要的字符,标记字符串结束。我们的程序在看到这个字符串的时候,会从第一个字符开始,直到碰到 \0 字符为止,这中间的内容就是字符串的内容。
字符串长度 vs. 字符串占用空间
| 字符串长度 | 字符串占用空间 | |
|---|---|---|
| 定义 | 字符串内容所占字节数量 | 字符串所占用的空间大小 |
"hello world" | 11 | 12(字符串长度 + \0) |
字符数组
字符数组,用来存放字符串的变量空间。本质上是一个数组,数组的每一个元素类型都是字符型,即 char 类型。
字符串操作
运算:使用现有值产生新值的一个过程。
| 函数 | 作用 |
|---|---|
strlen | 获取字符串长度 |
strcopy | 拷贝字符串 |
strcmp | 对比字符串 |
strcat | 连接两个字符串 |
详见
string.h头文件中的相关函数使用。
sscanf
提供一种将字符串信息转换成其他信息的方式。
char str[20] = "123.45";
double num;
// 将一个字符串转换成一个浮点型数据
// 使用sscanf从str所存储的字符串中读入一个浮点型数据,然后赋值给num变量
sscanf(str, "%lf", &num);
sprintf
提供一种将字符串信息赋值给指定变量的方式。
char str[100];
// 将原本输出到标准输出流中的内容,输出到str数组中
sprintf(str, "hello world");
sscanf 和 sprintf 函数本质上是以字符串为中间值,做各种数据类型之间的转换。