1.环境搭建
学习c语言首先的就是配置 学习环境 原来用的是Visual Studio 对于我这新手来说 不是很容易上手 就用vscod 搭配MinGW-w64来学习吧
应为vscod内部没有编译器,所以使用MinGW-w64来构成编译器。对于安装我就不多说了。
下载完成后首先就是验证环境时候搭建完毕 如果终端中出现了hello word 说明安装成功
程序代码分析
程序运行机制流程
C程序开发注意事项
(1)C程序源文件以"c"为扩展名。
(2)C程序的执行入口是main() 函数。
(3)C语言严格区分大小写。
(4)C程序由一条条语句构成,每个语句以 “;”(英文分号) 结束。
注释的作用
单行注释
单行注释
// 注释内容;
多行注释
多行注释
/* 注释内容 */
/*
注释内容
*/
输出内容
使用printf()输出内容到终端,要输出的内容需要用双引号包裹,如果需要换行可以使用\n
#include <stdio.h>
int main()
{
printf("hello word");
printf("\n你好世界\n");
return (0);
}
输出内容
代码块风格
`行尾风格` `次行风格`
#include <stdio.h> #include <stdil.h>
int main(){ int main ()
{
printf(“hello word”); printf(“hello word”);
return (0); return (0);
} }
2.变量
变量的概念
(1)变量是内从中的一个储存区域,该区域的数据可以在同一类型范围内不断变化。
(2)通过变量名,可以引用这块内存储区域,获取里面的值。
(3)变量的构成包含三个要素:数据类型、变量名、储存的值。
变量的声明和使用
(1)变量必须先声明,后使用。
(2)可以先声明变量再赋值,也可以在声明变量的同时进行赋值。
(3)变量的值可以在同一类型范围内不断变化。
示例代码如下:
#include <stdio.h>
int main
{
// 声明一个整数型变量,取名为a
int a;
// 对变量a进行赋值,
a = 100;
// 声明一个整形变量,取名为b,并直接赋值
int b = 200;
// 修改变量b的值,将变量a的值赋给b,
b = a;
// 同时声明多个整形变量并赋值
int c1 = 10,c2 = 20,c3 = 40;
return (0);
}
输出变量printf
printf 的标准含义是格式化输出文本,printf 的名称来源于 “print formatted”(格式化打印)的缩写,标准语法规则如下:
(1)格式化字符串是用双引号括起来的一个字符串,里面包括格式占位符和普通字符。
(2)格式占位符,也叫格式声明符,由%d和格式字符组成,作用是将输出的数据转换为指定的格式输出,这里%d表示整数,
(3)输出列表是程序需要输出的一些数据,可以是常量、变量、或者表达式,与格式占位符一 一对应。
示例代码:
#include <stdio.h>
int main()
{
// 声明一个整型变量,取名为 a
int a;
// 对变量 a 进行赋值
a = 100;
// 声明一个整型变量,取名为 b,并直接赋值
int b = 200;
// 输出变量的值
printf("a=%d \n", a); // 使用输出语句,把变量a 值输出, %d 表示输出的形式为整数
printf("b=%d \n", b); // 使用输出语句,把变量b 值输出, %d 表示输出的形式为整数
// 修改变量 b 的值, 将变量 a 的值赋值给 b
b = a;
// 输出变量的值
printf("b=%d \n", b); // 使用输出语句,把变量b 值输出, %d 表示输出的形式为整数
// 同时声明多个整型变量并赋值
int c1 = 10, c2 = 20, c3 = 30;
printf("%d %d %d", c1, c2, c3); // 10 20 30
return 0;
}
输出结果:
a=100
b=200
b=100
10 20 30;
输入数据赋值给变量
scanf主要用于从标准输入(通常是键盘)读取数据将其存储到指定的变量中(变量需要提前声明),同printf一样,位于头文件<stdio.h>中。
#include <stdio.h>
int main()
{
int num;
printf("Please Input A Number: ");
scanf("%d", &num); // 从标准输入读取整数,并将其存储到变量 num 中
printf("Your Number Is: %d\n", num);
int num1, num2, num3;
printf("PLeaase Input Three Number: ");
scanf("%d %d %d", &num1, &num2, &num3); // 从标准输入读取3个整数,使用空格分隔,并将分别将其存储到变量 num1、num2、num31 中
printf("Numbers: %d, %d, %d", num1, num2, num3);
return 0;
}
}
需要注意的是,scanf中,变量名前面需要添加 & 符号,该符号称为取地址符,
与printf相同,scanf也可以通过不同格式占位符为不同类型变量获取值。
标识符
c语言中变量,函数、数组名、结构体等要素命名时使用的字符序列,称为标识符
标识符命名规范
强制规范
(1)只能由小写或大写英文字母,0-9 或 _ 组成。
(2)不能以数字开头。
(3)不可以是关键字。
(4)标识符具有长度限制,不同编译器和平台会有所不同,一般限制在63个字符内。
(5)严格区分大小写字母。比如:Hello、hello是不同的标识符。
合法的标识符举例:
a、BOOK_sun、MAX_SIZE、Mouse、student23、Football、FOOTBALL、max、_add、num_1、sum_of_numbers
非法的标识符举例:
$zj、3sum、ab#cd、23student、Foot-baii、s.com、b&c、j**p、book-1、tax rate、don't
建议规范
(1)为了提高阅读性,使用有意义的单词,见名知意,如:sum,name,max,year等。
(2)使用下划线连接多个单词组成的标识符,如:max_classes_per_student。
(3)多个单词组成的标识符,除了使用下划线连接,也可以使用小驼峰命名法,除第一个单词外,后续单词的首字母大写,如 myVariableName、maxClassesPerStudent。
(4)不要出现仅靠大小写区分不同的标识符,如:name、Name容易混淆。
(5)系统内部使用了一些下划线开头的标识符,比如,C99标准添加的类型 _Bool
,为防止冲突,建议开发者尽量避免使用下划线开头的标识符。
关键字
关键字是一些具有特殊含义的保留单词。
ANSI有32个关键字 如下:
类型 | 具体关键字 |
---|---|
控制语句关键字(12 个) | break,case,contiune,default,do,else,for,goto,if,return,switch,while |
数据类型关键字(12个) | char, enum, double, long, float, int, short, signed, struct, unsigned, union, void, |
储存类关键字(4个) | auto, extern, register, static |
其他关键字(4个) | const, sizeof, typedef, volatile |
C99标准增加了5个关键字:inline、restrict、_Bool、_Complex和_Imaginary。
C11标准增加了7个关键字:_Alignas、_Alignof、_Atomic、_Static_assert、_Noreturn、_Thread_local和_Generic
3.常量
什么是常量
程序运行时,其他不能改变的量 ,即为常量
常量分类
(1)字面常量,直接使用的常量,不需要定义或声明,包括整数常量,浮点数常量、字符常量。
(2)标识符常量,使用标识符作为常量名,包括#define定义的标识符常量和const关键字定义的标识符常量以及枚举常量。
常量定义
字面常量不需要定义或声明,习惯常量使用大写,方便与变量区分
使用#define 定义常量
(1)介绍
#define来定义常量,也叫做宏定义,就是用一个标识符来表示一个常量值,如果后面的代码中出现了该标识符,那么编译时就全部替换成指定的常量值,即用宏替换所有宏名,简称宏替换。
(2)#define 定义常量格的格式
d define 常量名 常量值
注意
(1)不要以分号结尾,如有分号,分号会成为常量值的一部分。
(2)#define 必须写在 main 函数的外面(有些编译器的扩展允许 #define 写在 main 函数里,但我们强烈不建议这么做)。
#include <stdio.h>
#define PI 3.14 // 定义常量 PI,常量值3.14
int main()
{
double area;
double r = 1.2;
area = PI * r * r;
printf("面积 : %.4f", area);
return 0;
}
输出结果
面积 : 4.5216
const关键字
(1)介绍
C99标准新增,这种方式跟定义一个变量是一样的,只需要在变量的数据类型前再加上一个const关键字。
跟使用 #define定义宏常量相比,const定义的常量有详细的数据类型,而且会在编译阶段进行安全检查,在运行时才完成替换,所以会更加安全和方便。
(2)const 定义常量的格式
const 数据类型 常量名 = 常量值;
#include <stdio.h>
const double PI = 3.14; // 格式const 数据类型 常量名 = 常量值;
int main()
{
double arear;
double r = 1.2;
arear = PI * r * r;
printf("面积:%.4f", arear);
return (0);
}
输出结果
面积:4.5216
#define定义常量 和const定义常量区别
(1)执行时机:#define是预处理指令,在编译之前执行; const 是关键字,在编译过程中执行。
(2)类型检查:#define定义常量不用指定类型,不进行类型检查,只是简单地文本替换;const定义常量需要指定数据类型,会进行类型检查,类型安全性更强。
4.二进制
进制
计算机世界中只有二进制,所以计算机中存储和运算地所有数据都要转为二进制。包括数字、字符、图片、声音、视频等。
常见进制介绍
(1)二进制:0、1,满2进1。
(2)十进制:0 - 9,满10进1。
十六进制:0 - 9及A-F,满16进1。十六进制中,除了 0 到 9 十个数字外,还引入了字母,以便表示超过9的值。字母A对应十进制的10,字母B对应十进制的11,字母 C、D、E、F 分别对应十进制的 12、13、14、15。
进制转换表:
C语言中使用不同进制表示整数
(1)二进制:以0b或0B开头表示。
(2)十进制:正常数字表示。
(3)十六进制:以0x或0X开头表示,此处的A-F不区分大小写。
代码示例:
// 进制转换
#include <stdio.h>
void main()
{
int num1 = 0b10; // 0b表示二进制
int num2 = 210; // 十进制
int num3 = 0x1f; // ox表示16进制
printf("num1= %d\n", num1);
printf("num2=%d\n", num2);
printf("num3=%d\n", num3);
return(0);
}
输出结果:
num1= 2
num2=210
num3=31
输出格式
不同的进制只是整数的书写方法不同,不会对整数的实际存储方式产生影响。不同进制可以混合使用,比如 10 + 015 + 0x20 是一个合法的表达式。
使用格式占位符可以将整数以不同进制形式输出,相关的格式占位符如下:
%d :十进制整数。
%x :十六进制整数。
%#x :显示前缀 0x 的十六进制整数。
%#X :显示前缀 0X 的十六进制整数。
代码示例:
#include <stdio.h>
int main()
{
int x = 100;
printf("十进制;%d\n", x);
printf("十六进制;%x\n", x);
printf("十六进制(0x开头):%#x \n", x);
printf("十六进制(0x开头):%#x\n", x);
return (0);
}
输出结果:
十进制;100
十六进制;64
十六进制(0x开头):0x64
十六进制(0x开头):0x64
进制转换
原码、反码、补码
计算机底层存储数据时使用的是二进制数字,但是计算机在存储一个数字时并不是直接存储该数字对应的二进制数字,而是存储该数字对应二进制数字的补码。
机器数和真值
(1)机器数
一个数在计算机的存储形式是二进制数,我们称这些二进制数为机器数。机器数可以是有符号的,用机器数的最高位存放符号位,0表示正数,1表示负数。
(2)真值
因为机器数带有符号位,所以机器数的形式值不等于其真实表示的值(真值),以机器数10000001为例,其真正表示的值(首位为符号位)为-1,而形式值(首位就是代表1)为129;因此将带符号的机器数的真正表示的值称为机器数的真值。
原码、反码、补码的概念
(1)原码
原码的表示与机器数真值表示的一样,即用第一位表示符号,其余位表示数值。
——正数的原码:就是它对应的二进制数。
——负数的原码:它的绝对值对应的二进制数,且最左边位变为1。
——0的原码:仍然是0。
十进制的正负1,用8位二进制的原码表示如下:
+1 原码:[ 0000 0001 ]
-1 原码:[ 1000 0001 ]
(2) 反码
——正数的反码:和原码相同。
——负数的反码:在其原码的基础上,符号位不变,其余各位取反。
——0的反码:仍然是0。
十进制的正负1,用8位二进制的反码表示如下:
+1 原码:[ 0000 0001 ] 反码:[ 0000 0001 ]
-1 原码:[ 1000 0001 ] 反码:[ 1111 1110 ]
需要注意的是,反码通常是用来由原码求补码或者由补码求原码的过渡码。
(3) 补码
——正数的补码:和原码、反码相同。
——负数的补码:反码的基础上加1。
——0的补码:仍然是0。
十进制的正负1,用8位二进制的补码表示如下:
+1 原码:[ 0000 0001 ] 反码:[ 0000 0001 ] 补码:[ 0000 0001 ]
-1 原码:[ 1000 0001 ] 反码:[ 1111 1110 ] 补码:[ 1111 1111 ]
(4) 总结
(1)正数的原码、反码、补码都一样,三码合一。
(2)负数的反码:它的原码符号位不变,其它位取反(0 -> 1,1 -> 0);负数的补码:它的反码+1。
(3)0的反码,补码都是0。
数据类型
程序的主要目的就是对数据进行计算和处理,为了方便数据的管理,通常会对数据进行分类。就像根据容器的容量和形状不同,可以分成大杯中杯、大碗小碗等,不同的容器适合装不同的东西。
C语言根据数据的特性和用途进行了类型划分,不同类型的数据在内存中占据不同大小的空间。
整数类型
(1)基本介绍
整数类型简称整形,就是用于存放整形数值地,比如比如:12,30,3456等。
(2)整型的类型
类型 | 存储大小 | 值范围 |
---|---|---|
short 、signed | 2 字节 | -32,768 (- 2^15)到 32,767 (2^15 -1) |
int、signed int | 16位:2 字节16位:2 字节、32位:4 字节 | 16位:-32,768 (- 2^15 ) 到 32,767 (2^15-1)、32位:-2,147,483,648 (- 2^31) 到 2,147,483,647 (2^31 -1) |
第二行列1 | 第二行列2 | 第二行列3 |
第二行列1 | 第二行列2 | 第二行列3 |
关于存储大小单位:
bit(位):计算机中的最小存储单位,表示一个二级制位。
byte(字节):计算机中基本存储单元,1bite=8bite。
(3)整型注意事项
(1)个类型存储大小受到操作系统】编译器、硬件平台的影响。
(2)整型分为有符号signed和无符号unsigned两种,默认是signed。
(3)开发中使用整型一般用int型,如果不足以表示大数,可以使用long long。
(4)字面量后缀
字面量是源代码中一个固定值的表示法,用于直接表示数据,如图所示:
(1)一个整数字面量默认是int类型。
(2)如果需要表示 long 类型字面量,需要添加后缀 l 或 L。
(3)如果需要表示 long long 类型字面量,需要添加后缀 ll 或 LL。
(4)如果需要表示无符号整数字面量,需要添加后缀 u 或 U, 注意, u 和 l 可以结合使用,不分先后,如 ul(无符号long类型)、ULL(无符号 long long类型),lu(无符号 long 类型) 等。
(5)格式占位符
(1)%d 对应 int 类型,%u 对应 unsigned int 类型。
(2)%ld 对应 long 类型,%lu 对应 unsigned long 类型。
(3)%lld 对应 long long 类型,%llu 对应 unsigned long long 类型。
(6)精确宽度类型
类型名称 | 含义 |
---|---|
int8_t | 8 位有符号整数 |
int16_t | 16位有符号整数 |
int32_t | 32位有符号整数 |
int64_t | 64 位有符号整数 |
uint8_t | 8 位有符号整数 |
uint16_t | 16 位有符号整数 |
uint32_t | 32 位有符号整数 |
uint64_t | 64位有符号整数 |
上面这些都是类型别名,编译器会指定它们指向的底层类型。比如,某个系统中,如果 int 类型为32位, int32_t 就会指向 int ;如果 long 类型为32位, int32_t 则会指向 long 。
浮点类型
(1) 基本介绍
浮点类型可以表示一个小数,比如:123.4,7.8,0.12等。
(2) 浮点型的类型
类型 | 存储大小 | 值范围 | 有效小数位数 |
---|---|---|---|
float 单精度 | 4字节 | 1.2E-38 到 3.4E+38 | 第一行列3 |
double 双精度 | 8 字节 | 2.3E-308 到 1.7E+308 | 15 ~18 |
long double 长双精度 | 32位:10字节 | 32位:与 double 相同或更大 | 18或更多 |
long double 长双精度 | 64位:16字节 | 64位:3.4E-4932到1.2E+4932 | 18或更多 |
(3)浮点型注意事项
(1)各类型的存储大小和精度受到操作系统、编译器、硬件平台的影响。
(2)浮点型数据有两种表示形式。
十进制数形式:如:5.12、512.0f、.512(0.512 可以省略 0)
科学计数法形式:如:5.12e2、5.12E-2
(3)开发中用到浮点型数字,建议使用double型,如精度要求更高可以使用long double 型。
(4)字面量后缀
(1)浮点数字面量默认是double型,
(2)如果需要表示float类型字面量,须加后缀 f 或 F。
(3)如果需要表示long double类型字面量,需加后缀 l 或 L。
(5)格式占位符
在C语言中,占位符是一种用于格式化输出的特殊字符,通常用于 printf() 等输出函数中,用于指定输出的格式和内容。
(1)%f 是浮点类型的格式占位符,在printf中对应double类型(float类型会转换成double来处理);默认会保留6位小数,可以指定小数位数,如:%.2f 表示保留2位小数。
(2)%lf 在printf中和 %f意思相同(C99标准加入),也对应double类型,默认保留6位小数,可以指定小数位数,如:%.2lf 表示保留2位小数。但需要注意的是,在scanf中 %lf和 %f含义不同:输入一个float类型数据时使用 %f;而输入double类型时必须使用 %lf。
(3) %Lf 对应的是long double 类型,默认保留6位小数,可以指定小数位数,如: %.2Lf 表示保留2位小数。需要注意的是,输入输出 long double 类型都必须使用 %Lf 占位符。
(4)%e 对应科学计数法表示的浮点数,可以指定尾数部分所保留的小数位数,如 %.2e 表示尾数部分保留两位小数。
字符类型
(1)基本介绍
字符类型 char 可以表示单个字符,如一个数字、一个字母、一个符号。
(2)注意事项
(1)char类型的字面量是用单引号括起来的单个字符。
(2)可以使用转义字符 \ 表示特殊含义的字符。
转义字符 | 说明 |
---|---|
\b | 退格 |
\n | 换行符 |
\r | 回车符 |
\t | 制表符 |
\” | 双引号 |
\’ | 单引号 |
\ | 反斜杠 |
(3)多个字符称为字符串,在C语言中使用char数组表示,数组不是基本数据类型,而是构造类型,
(3)格式占位符
使用%c表示char类型。
(4)字符类型本质
(1)C语言中,char类型本质是一个整数,是ASCII码中对应的数字,存储长度是 1 个字节,char类型也可以进行数学运算。
(2)字符型同样分为signed char(无符号)和unsigned char(有符号),其中signed char取值范围-128 ~ 127,unsigned char取值范围0 ~ 255。默认是否带符号取决于当前运行环境。
(5)ASCII 码介绍
ASCII(American Standard Code for Information Interchange)码是一种用于表示文本字符的字符编码标准,一共规定了128个字符的编码,比如空格“SPACE” 是32(二进制00100000),大写的字母A是65(二进制01000001)。
布尔类型
(1)基本介绍
布尔值用于表示真、假两种状态,通常用于逻辑运算和条件判断。
获取数据的存储大小
使用sizeof 可以获取数据类型或变量、字面量的存储大小,单位是字节。sizeof返回一个size_t类型的无符号整数值,格式占位符是 %zu。
size_t 通常是 unsigned int 或 unsigned long 的别名,具体是哪个类型的别名,由系统和编译器决定。