环境搭建
HelloWorld
代码编写
Hello_World.c
#include<stdio.h>
int main()
{
printf("Hello World!");
return 0;
}
代码分析
-
‘#include’ : 引⼊头⽂件专⽤关键字。提前找到需要用到的东西。
-
<> : ⽤来包裹 库头⽂件名
-
stdio.h : 使⽤的头⽂件。因为程序中使⽤了 printf() 函数。就必须使⽤该头⽂件。
std:标准:standard
i: input 输⼊。
o: output 输出。
-
int :main 函数返回值为整型。
-
main: 整个程序的⼊⼝函数。 任何.c 程序,有且只有⼀个 main 函数。
-
printf(); C语⾔向屏幕输出字符使⽤的函数。
-
printf(“helloworld\n”)
printf();向屏幕输出一段内容
helloworld: 待写出的字符串内容。
\n: 回⻋换⾏。
-
return 0;
return 返回。 C程序要求,main 函数要有返回值。借助 return 实现返回。
0:成功!因为 int ,返回整数。
注意事项
- 程序中使⽤的所有的字符,全部是 “英⽂半⻆” 字符。
- 程序中,严格区分⼤⼩写。
- “;” 代表⼀⾏结束。不能使⽤ 中⽂ “;”,必须是英⽂。
执行流程
完成的C语言运行,分为以下4步,在VS中我们直接运行,其实是把中间的步骤给省略了
-
预处理(这一步后面单独讲解)
简单理解,就是先找到#include后面的 <stdio.h>这个文件
-
编译
把c文件编译成二进制文件后缀名为obj
-
连接/链接
把预处理找到的h文件,还有编译之后产生的obj文件打包在一起,产生exe文件
-
运行
运行exe文件
核心语法
注释
单行注释
// 这是单行注释文字
多行注释
/*
这是多行注释文字
这是多行注释文字
这是多行注释文字
*/
注意:多行注释不能嵌套使用。
注释示例
// 预处理,程序运行之前,需要提前做的事情
#include<stdio.h>
// 主入口
int main()
{
// 输出语句
printf("Hello World!\n");
/*
return:程序结束了
0 程序是正常结束
这里的0,需要跟上面的int呼应起来
*/
return 0;
}
关键字
关键字:在C语言中被赋予了特定含义的英文单词,一共有32个关键字
auto break case char const continue default do double else enum
extern float for goto if int long register return short signed
sizeof static struct switch typedef union unsigned void volatile while
- 关键字全部小写
- 在特定的编译器中,关键字是高亮显示的
vs:蓝色或者紫色
vs:蓝色
常量
程序运行的过程中,其值永远不会发生改变的数据
实型常量的小细节:
-
小数点前后,如果只有0,可以省略不写
0.93 可以写成 .93 18.0 可以写成 18.
-
科学计数法是实型常量,但是要写E
12340000 可以写成 1.2340000E7 但是写成 1.234 * 10的7次方就错误了,因为这是一个计算过程,不是最终的数字
输出常量
利用printf集合占位符的方式可以输出常量
格式:
printf(参数1,参数2);
参数1:输出内容的最终样式,以字符串的形式体现 (必填)
参数2:填补的内容 (选填)
占位符:
占位符 | 说明 |
---|---|
整形 | %d |
实型 | %f |
字符 | %c |
字符串 | %s |
-
输出一个整数
#include <stdio.h> int main() { printf("%d", 10); return 0; }
-
输出一个小数
#include <stdio.h> int main() { printf("%f", 1.93); return 0; }
-
输出一个字符
#include <stdio.h> int main() { printf("%c", 'A'); return 0; }
-
输出一个字符串
#include <stdio.h> int main() { // 第一种方式: printf("Hello World!"); // 第二种方式: printf("我的名字为:%s","尼古拉斯·纯情·暖男·天真·阿玮"); return 0; }
输出并换行
操作系统 | 换行符 |
---|---|
windows | \r\n |
mac | \r |
Linux | \n |
平时写代码的时候,想要换行直接写\n即可,C语言会根据不同的操作系统解析成对应的换行符
变量
-
变量的三要素
- 变量名:用来在程序中使用。
- 变量类型:开辟内存空间大小。
- 变量值:存储的实际数据
变量定义:
类型名 变量名 = 变量值(一般都这么写)
举例:
int m = 57;
会开辟内存空间给变量。变量声明不会开辟内存空间。
代码演示:
#include <stdio.h>
int main()
{
// 1. 定义格式:
// 数据类型 变量名;
int a;
// 2. 赋值/修改值
// 变量名 = 数据值;
a = 10;
// 3. 如果定义的时候已经知道了变量中要存储什么样的数据
// 数据类型 变量名 = 数据值;
int b = 20;
return 0;
}
变量的注意事项
- 只能存一个值
- 变量名不允许重复定义
- 一条语句可以定义多个变量
- 变量在使用之前一定要进行赋值
- 变量的作用域范围
计算机进制
-
代码书写
-
二进制:由0和1组成,代码中以0b开头
-
十进制:由0~9组成,前面不加任何前缀
-
八进制:由0~7组成,代码中以0开头
-
十六进制:由0~9还有 a ~ f 组成,代码中以0x开头
-
任意进制转十进制
公式: 系数*基数的权次幂 相加
-
二进制转十进制
-
十进制转其他进制
-
总结
数据类型
数据类型可以决定变量中能存储什么类型的数据, 决定存储空间的大小
-
sizeof 运算符
语法 1:sizeof(变量名)
int a = 10; printf("%zu\n", sizeof(a));//sizeof(a) 获取 a 变量占用内存大小(字节)。可以用 printf 显示出来
语法 2:sizeof(类型名)
printf("%zu\n", sizeof(double)); // 也可以使用 sizeof 直接查看某种类型占用的内存大小
-
整型
数据类型 字节数 格式符 数据范围 最小值宏 最大值宏 short(短整型) 2 %hd -215 ~ 215-1 (-32768 ~ 32767) SHRT_MIN SHRT_MAX int(整型) 4 %d -231 ~ 231-1 (-2147483648 ~ 2147483647) INT_MIN INT_MAX long(长整型) 4 %ld -231 ~ 231-1 (-2147483648 ~ 2147483647) LONG_MIN LONG_MAX long long(长长整型) 8 %lld -263 ~ 263-1 LLONG_MIN LLONG_MAX unsigned short(无符号 短整型) 同 short %hu 0 ~ 216-1 (0 ~ 65535) 0 USHRT_MAX unsigned int(无符号 整型) 同 int %u 0 ~ 232-1 (0 ~ 4294967295) 0 UINT_MAX unsigned long(无符号 长整型) 同 long %lu 0 ~ 232-1 (0 ~ 4294967295) 0 ULONG_MAX unsigned long long(无符号 长长整型) 同 long long %llu 0 ~ 264-1 0 ULLONG_MAX 上表中列出的占用字节数和取值范围,是大多数情况下各种类型的取值。
由于,C 标准没有具体规定以上各类数据所占用的字节数。因此,在不同系统、编译器下,数据类型占用的字节数会有所不同。
比如:int 类型,在 Turbo C 环境占 2 字节,取值范围与 short 相同。 而在 Visual C 环境下是 4 字节。
再如:long 类型,相同的 gcc 编译器下,在 Windows 系统中占 4 字节,而在 Linux 系统中占 8 字节。
可以使用 sizeof 查看 数据类型 占用内存的大小。
可以引入头文件 #include <limits.h> 借助宏来查看 数据类型 在当前平台上 对应的最小、最大值。
// 预处理,程序运行之前,需要提前做的事情 #include<stdio.h> // 主入口 int main() { short a = 10; printf("%hd\n", a); printf("%zu\n", sizeof(a)); int b = 10; printf("%d\n", b); printf("%zu\n", sizeof(b)); long c = 10L; printf("%ld\n", c); printf("%zu\n", sizeof(c)); long long d = 10LL; printf("%lld\n", d); printf("%zu\n", sizeof(d)); return 0; }
-
实型
实型表示有符号的十进制小数,在计算机内部以浮点方式表示(小数点是浮动的),因此也叫浮点型。
常见实型有两种: float (单精度)、 double (双精度)
实型数据没有八、十六进制,也没有 unsigned 无符号形式。在计算机底层采用的是近似计算,实现比较复杂,且不同平台处理方式不同。我们这里只学习它基本的知识。
小数的取值范围比整数的要大
C语言中的小数默认double类型的
小数不可以和unsigned组合,unsigend只能和整数类型组合。
// 预处理,程序运行之前,需要提前做的事情 #include<stdio.h> // 主入口 int main() { //float:单精度小数 (精确度小数点后6位)windows占4个字节 (38位) float a = 3.14F; printf("%f\n", a);//3.140000 printf("%.2f\n", a);//3.14 printf("%zu\n", sizeof(a));//4 //double:双精度小数 (精确度小数点后15位)windows占8个字节 (308位) double b = 1.23456789; printf("%lf\n", b); //1.234568 printf("%.2lf\n", b); //1.23 printf("%.8lf\n", b); //1.23456789 printf("%zu\n", sizeof(b));//8 //long double 高精度小数 (精确到小数点后18~19位)windows占8个字节(其他12,16) long double c = 3.1415926L; printf("%lf\n",c);//3.141593 printf("%.2lf\n",c);//3.14 printf("%.7lf\n",c);//3.1415926 printf("%zu\n", sizeof(c));//8 return 0; }
-
字符
char 取值范围:ASCII码表中的字母,数字,英文符号
// 预处理,程序运行之前,需要提前做的事情 #include<stdio.h> // 主入口 int main() { //char 取值范围:ASCII码表中的字母,数字,英文符号 char c1 = 'a'; printf("%c\n", c1); //如果用 %d,就显示 其 ASCII 值了。 printf("%d\n", c1);//97 printf("%zu\n", sizeof(c1));//1 char c2 = '1'; printf("%c\n", c2); printf("%zu\n", sizeof(c2));//1 char c3 = 'A'; printf("%c\n", c3); char c4 = '.'; printf("%c\n", c4); return 0; }
-
字符串
// 预处理,程序运行之前,需要提前做的事情 #include<stdio.h> // 主入口 int main() { printf("请输入一段文字:"); /* 字符串变量的定义方式: 数据类型 变量名[大小] = "字符串"; char str[内存占用大小] = "abc"; 内存占用大小的计算方式: 英文:1个字母、符号、数字占用一个字节 中文:默认情况下一个中文占两个字节 结束标记:1个字节 */ char str[4]; scanf("%s", &str); printf("%s", str); return 0; }
-
隐式转换
-
强制转换
标识符
标识符:代码中所有我们自己起的名字。比如变量名、函数名等。
标识符的硬性要求:
以数字、字母、下划线组成
不能以数字开头
不能是关键字
区分大小写
标识符的软性建议:
用英文单词,见名知意
变量名:全部小写
文件名:全部小写,单词之间用下划线隔开
键盘录入
scanf ,是scanner format的缩写,是c语言提供的一个函数。可以结合 格式符 读取各种类型数据。
//在 CRT 中关闭这些函数的弃用警告
#define _CRT_SECURE_NO_WARNINGS
// 预处理,程序运行之前,需要提前做的事情
#include<stdio.h>
// 主入口
int main()
{
int a;
scanf("%d", &a);
printf("%d\n", a);
return 0;
}
printf("请输入三个整数,用逗号间隔:");
int a, b, c; // 可以不赋初值。
scanf("%d,%d,%d", &a, &b, &c);
int d = a + b + c;
printf("%d", d);
注意事项
-
不要在 scanf 的参 1 中,添加类似 printf() 的提示字符串和 \n 换行符。
-
键入数据时,数据个数、类型、顺序,必须与参 1 中占位符一一对应。
-
键入数据时,数据间的分割符,必须与 参 1 中 占位符的分割符一致。
-
scanf 的返回值,代表格式符成功匹配数据的次数。(较少使用)
-
VS2019 以后的版本编译时,会将 scanf 划为 “不安全函数”,爆出C4996 错误,推荐你使用 s_scanf() 函数。
但,学习、练习、测试时,直接使用 scanf 很方便,可暂时屏蔽该错误。
- 方法 1: 在项目中设置:工程名→右键→属性→C/C++→预处理器→预处理器定义→编辑→将 _CRT_SECURE_NO_WARNINGS 加入“预处理定义” 中
- 方法 2: 在每个.c文件开头(第一行)添加宏:#define _CRT_SECURE_NO_WARNINGS
运算符
算术运算符
- 先 * / %,后 + -。
- 除法
- 两整数相除,结果整数(舍小数部分)
- 两浮点数相除,结果 double 浮点数
- 整数和实数相除,自动类型转换为实型
- 不允许 除 0(与数学一样)
- 取模(取余)
- 运算数必须是整型
- 对负数取余,结果为余数的绝对值
- 不允许 除 0(与数学一样)
- 小数直接参与计算,结果有可能是不精确的
比较运算符
注意: 判断 “相等”,使用 “==”, 不能使用 “=”(赋值符)
优先级:
- 整体,比算术运算符 低。
- 整体,比赋值运算符 高。
- > >= < <= 高于 == !=
赋值运算符
包括:基本赋值运算符 和 复合赋值运算符( = 与算数运算符 组合而成)。
作用:给变量赋值。 结合性:自右向左。
**注意:** 赋值运算符,会修改变量的原始值。 赋值符左侧,必须可修改(变量)。
自增减运算符
注意:++ 和 – 如果 不是单独使用(如:用在表达式中),前缀和后缀 差异巨大
-
放在变量前,先 +1、-1 再取值使用。
int a = 10; int res = ++a; // 先 +1,再取 a 值给 res。 (先加再用)
-
放在变量后,先 取值用,再 +1、-1
int b = 10; int res2 = b--; // 先取 b 值给 res2, 而后 b 再 -1 (先用再减)
注意事项:
- 不能用于常量
- 不能用于表达式
- 优先级:整体高于算数运算符(必然高于比较、赋值);后缀高于前缀
- 不要在一个表达式中,对同一变量 多次 ++、-- 运算。可读性差,且不用编译系统结果不同。
逻辑运算符
三元运算符
优先级:
高于 赋值运算符,低于 算数、逻辑、比较运算符。
逗号运算符
运算符的优先级
流程控制语句
顺序结构
顺序结构是程序默认的执行流程
顺序结构是从上往下依次运行的
分支结构
if语句
if (关系表达式)
{
语句体A;
}
else if(关系表达式)
{
语句体B;
}
else
{
语句体C;
}
switch语句
把所有的选择一一列举出来,根据不同的条件任选其一。
switch (表达式){
case 值1:
语句体1;
break;
case 值2:
语句体2;
break;
......
default:
语句体n;
break;
}
循环结构
for循环
/*
for(初始化语句; 条件判断语句; 条件控制语句)
{
循环体语句;
}
*/
//打印3遍Hello
for (int i = 0; i < 3; i++)
{
printf("Hello\n");
}
while语句
/*
初始化语句
while(条件判断语句)
{
循环体语句
条件控制语句
}
*/
//打印3遍Hello
int i = 0;
while (i<3)
{
printf("Hello\n");
i++;
}
do…while语句
循环高级
-
无限循环
-
跳转控制语句
- break:不能单独书写,只能写在switch,或者循环中,表示结束、跳出的意思。
- continue:只能写在循环中,表示跳过本次循环,继续下次循环
-
循环嵌套
goto
可以跳转到任意地方。但一般只用于跳出循环。
//外循环
for (int i = 1; i <= 3; i++) {
//内循环
for (int j = 1; j <= 3; j++) {
printf("打印内循环\n");
break;//只能跳出内循环
}
printf("内循环结束!!!\n");
}
//外循环
for (int i = 1; i <= 3; i++) {
//内循环
for (int j = 1; j <= 3; j++) {
printf("打印内循环\n");
//break;//只能跳出内循环
goto a;
}
printf("内循环结束!!!\n");
}
//标号
a:printf("外循环结束---");
函数
- 函数:函数就是程序中独立的功能。
函数的定义格式
返回值类型 函数名(形参1, 形参2...)
{
函数体;
return 返回值;
}
函数的定义调用
// 预处理,程序运行之前,需要提前做的事情
#include<stdio.h>
//定义一个函数
void test()
{
printf("hello\n");
}
// 主入口
int main()
{
//调用test()函数
test();
return 0;
}
// 预处理,程序运行之前,需要提前做的事情
#include<stdio.h>
//定义一个求和函数
int sum(int num1, int num2) {
return num1 + num2;
}
// 主入口
int main()
{
//调用sum()函数
int count = sum(2, 3);
printf("%d\n", count);
return 0;
}
// 预处理,程序运行之前,需要提前做的事情
#include<stdio.h>
int sum(int num1, int num2);
// 主入口
int main()
{
//调用sum()函数
int count = sum(2, 3);
printf("%d\n", count);
return 0;
}
//定义一个求和函数
int sum(int num1, int num2) {
return num1 + num2;
}
函数的注意事项
C语言中常见的函数
https://zh.cppreference.com/
-
math.h
// 预处理,程序运行之前,需要提前做的事情 #include<stdio.h> #include<math.h> // 主入口 int main() { /* math.h pow() 幂 sqrt() 平方根 ceil() 向上取整 floor() 向下取整 abs() 绝对值 */ double res1 = pow(2, 3); printf("%lf\n", res1);//8.000000 double res2 = sqrt(9); printf("%lf\n"</