c语言学习
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 类型。