本文介绍:C语言基础知识:注释、变量、数据类型、数据类型长度、可移植类型、常量、数值表示、二进制、八进制、十六进制转换、数值储存、原码、反码、补码
一、入手第一个代码练习
第一个C语言程序:HelloWorld
#include <stdio.h>
int main() {
printf("hello world\n");
return 0;
}
C语言的源代码文件是一个普通的文本文件,但扩展名必须是 .
代码分析:
1.include头文件包含
- #include的意思是头文件包含,#include <stdio.h>代表包含stdio.h这个头文件
- 使用C语言库函数需要提前包含库函数对应的头文件,如这里使用了printf()函数,需要包含stdio.h头文件
- 头文件:在c语言中后缀名为h的文件被称为头文件,头文件就像一本书的目录,当我们想使用某本书里的内容时,只需把目录(头文件)引进来就可以了。
-
2.main函数
- 程序的入口,一个程序有且只有一个main函数入口
- {}叫代码块,一个代码块内部可以有一条或者多条语句
- 所有的可执行语句必须是在代码块里面
- C语言每句可执行代码都是";"分号结尾
- 所有的#开头的行,都代表预编译指令,预编译指令行结尾是没有分号的
-
3.printf函数
- printf是C语言库函数,功能是向标准输出设备输出一个字符串
- printf(“hello world\n”);
- \n的意思是回车换行
-
4.return语句
- return代表函数执行完毕,返回return代表函数的终止
- 在main函数中return 0代表程序执行成功
-
二、注释
- 介绍 :对代码的解释和说明
- 特点:不会被执行
- 目的:让人们能够更加轻松地看懂代码
- 分类:行注释 // 快键键 ctrl+/ 和 块注释 /**/ 快捷键Ctrl + Alt +A
-
#include <stdio.h> int main() { // 行注释 这是单行注释 /* 这是多行注释 块注释 */ return 0; }
三、数据类型
-
简单介绍一下C语言有哪些常用类型
-
1.数据类型的作用:编译器预算数据分配的内存空间大小(重点)
-
2可以通俗理解为:数据类型是用来规范内存的开销,约定数据在内存中的格式,便于存储。
-
四、变量(重要)
-
一、变量的语法
-
1.在计算机程序中,变量是用来存储数据的一个内存区域,并用一个名字来表示这个区域
-
#include <stdio.h> int main() { // 1. 定义1个int变量age同时赋值为18(这叫初始化),然后打印内容 int age = 18; printf("%d\n", age); // 2. 修改age的内容为20,然后打印内容 age = 20; printf("%d\n", age); // 3. 定义2个int变量,然后在分别赋值,然后再打印内容 int a, b; a = 123; b = 256; printf("%d\n", a); printf("%d\n", b); // 4. 定义1个float类型变量height同时赋值,然后打印内容 float height = 1.77; printf("%f\n", height); return 0; }
-
二、特点
-
1.变量在使用前必须先定义,定义变量前必须有相应的数据类型;
-
2.在程序运行过程中,其值可以改变;
-
三、命名规则
-
一、忌讳
-
1.只能由数字、字母、下划线_组成;
-
2.不能使用数字开头;
-
3.不能使用关键字
-
二、建议
-
1.大驼峰
-
每个单词首字母大写, 例如: MyFirstName
-
2.小驼峰
-
第二个单词开始首字母大写, 例如: myFirstName
-
3.下划线命名
-
每个单词之间使用下划线连接, 例如: my_first_name
-
特殊类型 布尔类型(Bool)
-
布尔类型是一种处理逻辑的类型,其有两个值,分别是真(true)或假(false),它在内存中的长度一般只占用1个字节。
- 早期C语言没有布尔类型数据,以0代表逻辑假,非0代表逻辑真;
- C99标准定义了新的关键字_Bool,提供了布尔类型,或者也可以使用stdbool.h中的bool;
-
#include <stdio.h> // bool 类型需要添加以下这个才能使用 #include <stdbool.h> int main() { // 定义一个bool类型变量,同时赋值为true,然后打印变量的值 bool flag = true; printf("%d\n", flag); //输出 1 // 修改上一步变量的值为false,然后打印变量的值 flag = false; printf("%d\n", flag); //输出 0 return 0; }
五、数据类型长度
-
存储单位说明
-
基本数据类型长度
- 数据类型的长度会受操作系统平台的影响,所以在不同平台下基本数据类型的长度是不一样的。
-
sizeof输出类型长度(大小)
-
#include <stdio.h> int main() { // 通过sizeof打印各种类型的长度(大小) printf("char length = %d\n", sizeof(char)); printf("short length = %d\n", sizeof(short)); printf("int length = %d\n", sizeof(int)); printf("long length = %d\n", sizeof(long)); printf("float length = %d\n", sizeof(float)); printf("double length = %d\n", sizeof(double)); printf("long double length = %d\n", sizeof(long double)); // 定义int类型变量,sizeof打印变量的大小 int a; printf("a length = %d\n", sizeof(a)); return 0; }
六、可移植的类型
-
最开始我们介绍C语言是一门跨平台的编程语言,使用C语言编写的程序可以在不同的系统平台下运行,这里有一些前提,为了更好的兼容不同平台,我们在使用基本上数据类型的时候会采用可移植的类型,这些类型可以确保在不同的平台下稳定的运行。
- C语言在可移植类型头文件 stdint.h 和 inttype.h 中规定了精确宽度整数类型,以确保C语言的类型在各系统内功能相同。
-
#include <stdio.h> #include <inttypes.h> int main() { // 8位整型 int8_t a=127; printf("%d\n", sizeof(a)); // 16位整型 int16_t b = 127; printf("%d\n", sizeof(b)); // unsigned 无符号,没有符号位,数值为正数 uint8_t c = 255; uint16_t d = 200; return 0; }
七、常量
-
与变量不同,常量的值在程序运行时不会改变。
-
常量的定义方式有两种:
-
-
1.自定义常量
// 预处理常量 #define PI 3.14 // const常量 const double pi2 = 3.14;
#include <stdio.h> // 预处理常量 #define PI 3.14 int main() { // const常量 const double pi2 = 3.14; // 常量不能修改,以下代码是错误的 PI = 3.33; pi2 = 3.33; return 0; }
2.系统定义的常量
-
#include <stdio.h> #include <float.h> #include <limits.h> int main() { // 打印float类型能够表示的最大值和最小值 printf("%lf\n", FLT_MIN); printf("%lf\n", FLT_MAX); // 打印char类型位数以及能够表示的最大值和最小值 printf("%d\n", CHAR_BIT); printf("%d\n", CHAR_MIN); printf("%d\n", CHAR_MAX); // 打印short类型能够表示的最大值和最小值 printf("%d\n", SHRT_MIN); printf("%d\n", SHRT_MAX); // 打印int类型能够表示的最大值和最小值 printf("%d\n", INT_MIN); printf("%d\n", INT_MAX); // 打印long类型能够表示的最大值和最小值 printf("%ld\n", LONG_MIN); printf("%ld\n", LONG_MAX); return 0; }
八、数值表示
-
进制
- 进制也就是进位制,是人们规定的一种进位方法
- 对于任何一种进制—X进制,就表示某一位置上的数运算时是逢X进一位
-
- 二进制就是逢二进一,八进制就是逢八进一,十进制是逢十进一,十六进制是逢十六进一,以此类推,x进制就是逢x进位
-
1.二进制
- 二进制是计算技术中广泛采用的一种数制。二进制数据是用0和1两个数码来表示的数
- 它的基数为2,进位规则是“逢二进一”,借位规则是“借一当二”
- 当前的计算机系统使用的基本上是二进制系统,数据在计算机中主要是以补码的形式存储的
- 十进制转化二进制的方法:
- 用十进制数除以2,分别取余数和商数,商数为0的时候,将余数倒着数就是转化后的结果
-
2.八进制
- 八进制,Octal,缩写OCT或O,一种以8为基数的计数法,采用0,1,2,3,4,5,6,7八个数字,逢八进1
-
- 一些编程语言中常常以数字0开始表明该数字是八进制
- 八进制的数和二进制数可以按位对应(八进制一位对应二进制三位),因此常应用在计算机语言中
- 八进制和二进制互转:
-
- 十进制转化八进制的方法:
-
- 用十进制数除以8,分别取余数和商数,商数为0的时候,将余数倒着数就是转化后的结果
-
3.十六进制
- 十六进制(英文名称:Hexadecimal),同我们日常生活中的表示法不一样,它由0-9,A-F组成,字母不区分大小写
-
- 与10进制的对应关系是:0-9对应0-9,A-F(或a-f)对应10-15
- 十六进制的数和二进制数可以按位对应(十六进制一位对应二进制四位),因此常应用在计算机语言中
- 十六进制和二进制互转:
-
- 十进制转化十六进制的方法:
-
- 用十进制数除以16,分别取余数和商数,商数为0的时候,将余数倒着数就是转化后的结果
-
C语言如何表示相应进制数
-
#include <stdio.h> int main() { // 十进制方式赋值 int a = 15; // 八进制方式赋值 int b = 017; // 十六进制方式赋值 int c = 0xf; // 二进制方式赋值 int d = 0b1111; printf("%d, %d, %d, %d\n", a, b, c, d); return 0; }
九、数值存储方式
-
计算机底层都是存储数据都是采用二进制,但二进制也有几种,比如:原码、反码、补码。接下来我们来看看他们之间的关系的意义作用。
-
1.原码(十进制转二进制)
-
十进制数按照:除二取余、倒序排列,得到的就是原码。
- 10 -> 0000 1010
- -10 -> 1000 1010
- -1 -> 1000 0001
- 1 -> 0000 0001
-
问题
-
原码在做计算的时候会出现一些问题,比如正负数的加法运算,以及零的问题。
-
正负数加法
- -1 + 1 = 0
-
1000 0001 + 0000 0001 ---------------- 1000 0010 -> -2 ?
-
正负零
- +0 和 -0
-
0000 0000 1000 0000
-
2.反码(原码)
-
为了解决上面的问题,出现了反码,反码的计算规则如下:
- 正数的反码就是原码本身;
- 负数的反码是按位取反(但符号位不变);
-
示例
- 1 -> 0000 0001 -> 0000 0001
- -1 -> 1000 0001 -> 1111 1110
-
0000 0001 + 1111 1110 ----------------- 1111 1111
111 1111 是运算完之后的结果,但要注意,这时还是反码,需要重新返回来:1000 0000 。
反码解决了正负数加法问题,但正负零的问题还是存在。
-
3.补码
-
正数的补码就是原码本身;
负数的补码就是在反码的基础上+1;
- 1 -> 0000 0001 -> 0000 0001 -> 0000 0001
- -1 -> 1000 0001 -> 1111 1110 -> 1111 1111
-
0000 0001 + 1111 1111 ---------------- 0000 0000
补码在正负数加减法运算时没问题,也不会出现正负零占两个二进制。但 1000 0000 不表示为负零,用来表示什么呢?计算机其实默认把8位有符号二进制 1000 0000 表示为 -128 。
-
int8_t e = 0b10000000; printf("%d\n", e);