C语言_1 C语言概述_2 数据变量

本文介绍了C语言的基础知识,包括C语言的特点、应用领域、编译过程以及数据变量的概念。讲解了变量的声明、定义、数据类型、常量、变量命名规则,并详细阐述了整型、字符型、实型(浮点型)的定义和输出。还讨论了进制转换、计算机内存数据的存储方式,如原码、反码、补码,以及数值溢出的概念。最后提到了字符串常量、printf和scanf函数的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 C语言概述

1.1 什么是C语言
语言是人和人交流,C语言是人和机器交流。

1.2 为什么要学习C语言
1.2.1 C语言特点
优点:代码量小、执行速度快、功能强大、编辑自由
缺点:写代码实现周期长、可移植性较差、过于自由,经验不足易出错、平台库依赖较多

1.2.3 C语言应用领域
1)C语言可以写网站后台程序
2)C语言可以专门针对某个主题写出功能强大的程序库
3)C语言可以写出大型游戏的引擎
4)C语言可以写出另一个语言来
5)C语言可以写操作系统和程序驱动,并且只能用C语言来编写
6)任何设备只要配置了微处理器,就都支持C语言,从微波炉到手机,都是由C语言技术来推动的

1.3 第一个C语言程序:HelloWorld
1.3.1 编写C语言代码:hello.c

//导入一个文件 stdio.h std 标准库 i input o output 标准输入输出库 .h头文件
//<>导入系统文件 ""导入自定义文件
#include<stdio.h>
//int 数据类型 整型,如果出现在函数中表示函数的返回值
//main 程序的主函数 程序有且只有一个主函数,()里表示函数的参数 函数的参数可以有多个 中间由 , 分隔
init main()
{
	//{} 函数体 代码体 程序体
	//printf 是stdio.h中系统提供的函数,表示在标准输入输出设备上打印字符串
	//"" 字符串 ; 一条语句的结束
	print("hello world");
	//return 如果出现在其他函数中表示函数结束,如果出现在main函数中表示程序结束
	//0 函数的返回值,要和函数返回值类型对应
	return 0;
}
//行注释,注释一行
/*
块注释,注释多行,注释内容不参与程序编译
*/

C语言的源代码文件是一个普通的文本文件,但扩展名必须是.c。

1.4 system函数

#include<stdib.h>
int system(const char *command);

功能:在已经运行的程序中执行另外一个外部程序
如果带路径 \ 或 /
参数:外部可执行程序名字
返回值: 成功 0;失败 任意数字

#include <stdlib.h>
#include <stdio.h>
int main(void)
{
	//cmd命令 calc计算器 notepad记事本 mspaint画图板
	//system("D:\\Desktop\\FeiQ.exe");
	int value;
	value = system("calc");
	//%d是一个占位符,表示输出一个整型数据
	printf("%d\n", value);
	return 0;
}

1.5 C语言编译过程
1.5.1 C语言编译步骤
C代码编译可执行程序经过4步:
1)预处理:宏定义展开、头文件展开、条件编译等。同时将代码中的注释删除,这里并不会检查语法
2)编译:检查语法,将预处理后文件编译生成汇编文件
3)汇编:将汇编文件生成目标文件(二进制文件)
4)链接:C语言写的程序是需要依赖各种库的,所以编译之后还需要把库链接到最终的可执行程序中去

2 数据变量

2.1 变量与常量
2.1.1 关键字
C的关键字总共有32个

  • 数据类型关键字(12个)
    char,short,int,long,float,double,unsigned,signed,struct,union,enum,void
  • 控制语句关键字(12个)
    if,else,switch,case,default,for,do,while,break,continue,goto,return
  • 存储类关键字(5个)
    auto,extern,register,static,const
  • 其他关键字(3个)
    sizeof,typedef,volatie

2.1.2 数据类型
数据类型的作用:编译器预算对象(变量)分配的内存空间大小。
在这里插入图片描述
2.1.3 4 常量 变量
常量:在程序运行过程中,其值不能发生改变的量
定义常量:
1)const 数据类型 常量名 = 值;(不安全)
2)宏定义常量:#define 常量名 值(无= 无;)
变量:在程序运行过程中,其值可以发生改变的量;变量在使用前必须先定义,定义变量前必须有相应的数据类型
数据类型 标识符 = 值;
标识符命名规则:
标识符不能使关键字;只能由字母、数字、下划线组成;第一个字母必须是字母或下划线 不允许数字开头;标识符中字母区分大小写;见名知义 驼峰式命名 RoleLv role_lv
在定义局部变量可以在数据类型前加修饰suto,也可以不加 加不加无影响,一般不加

int ___ = 123; 无命名含义
float 1_abc_123 = 1;对
float ABC = a;一个变量赋值给另外一个变量,上面内容会影响下面操作
int Int =123;可以 Int区分大小写,不是关键字

快速复制:复制到下/上一行 Alt+Shift+下/上键;

#include<stdio.h>
//宏定义常量
#define PI 3.14159
//圆的面积和周长 s=pi*r*r l=2*pi*r
int main02(void)
{
	//常量 PI,const修饰
	//const float pi = 3.14159;
	float r = 2;
	float s = PI * r * r;
	float l = 2 * PI * r;
	//占位符 %d整型 %f浮点型,默认保留六位小数,会四舍五入
	printf("圆的面积:%.2f\n",s);
	printf("圆的周长:%.2f\n",l);
	return 0;
}

声明和定义的区别:

  • 声明变量不需要建立存储空间,如:extern int a;
  • 定义变量需要建立存储空间,如:int b;
    从广义的角度来讲声明中包含着定义,即定义是声明的一个特例,所以并非所有的声明都是定义:
  • int b; 它既是声明,同时又是定义
  • 对于extern b; 来讲它只是声明不是定义
    一般情况下,把建立存储空间的声明称之为“定义”,而把不需要加你存储空间的声明称之为“声明”。

2.2 整型:int
2.2.1 整型变量的定义和输出
在这里插入图片描述

#include<stdio.h>
int main03(void)
{
	//有符号 signed(可以省略)
	//int a = -10;
	//printd("%d\n", a);

	//无符号unsigned(不可省略,后面只能定义整数 负数会乱码)
	unsigned int a = 10;
	printf("%u\n", a);
	return 0;
}
//一个程序中允许多个函数,但只有一个主函数main
int main(void)
{
	//进制 
	//十进制 以正常数字1-9开头
	//二进制0-1 在计算机定义数据时,不可以直接书写二进制
	//八进制0-7,以0开头 
	//十六进制0-9 10-15(a-f/A-F),以0x/0X开头
	//C语言中的进制表现形式有三种:十进制 八进制 十六进制
	
	//int a = 10;
	//printf("%d\n", a);
	//printf("%x\n", a);//a-f
	//printf("%X\n", a);//A-F
	//printf("%o\n", a);
	
	//定义八进制数据 以0开头
	int a = 0123;
	//定义十六进制数据 以0x/0X开头
	int b = 0x123;
	printf("%d\n", a);
	printf("%o\n", a);
	printf("%x\n", a);
	printf("%d\n", b);
	printf("%o\n", b);
	printf("%x\n", b);
	return 0;
}

2.2.2 整型输入

//scanf安全问题解决警告
#define _CRT_SECURE_NO_WARNING //写在第一行 方法1
#include<stdio.h>
//prama warning(disable:4996) /方法2
int main04(void)
{
	int a;
	//通过键盘输入赋值
	//&运算符 表示取地址运算符
	scanf("输入数字:%d", a);
	printf("打印数字:%d\n", a);
}

2.2.3 short、int、long、long long
在这里插入图片描述
short<=int<=long<long long
整型常量 所需类型
10 代表long类型
10l,10L long long类型
10ll,10LL unsigned int类型
10u,10U unsigned long类型
10ull,10ULL unsigned long long类型

打印格式 含义
%hd 输出short类型
%d int类型
%ld long类型
%lld long long类型
%hu unsigned short类型
%u usigned int类型
%lu usigned long类型
%llu usigned long long类型

#include<stdio.h>
int main()
{
	//整型变量
	int a = 10;
	//短整型变量
	short b = 20;
	//长整型变量
	long c = 30;
	//长长整型变量
	long long d = 40;
	
	printf("%d\n", a);
	printf("%hd\n", b);
	printf("%ld\n", c);
	print("%lld\n", d);
	
	//sizeof 计算数据类型在内存中占的字节(BYTE)大小 sizeof(数据类型)	sizeof(变量名)
	//1B=8bit
	//unsigned int len = sizeof(a);
	//unsigned int len = sizeof(int);
	//printf("%d\n", len);

	printf("整型:%d\n", sizeof(a));//4=32bit
	printf("短整型:%d\n", sizeof(b));//2
	printf("长整型:%d\n", sizeof(c));//4
	printf("长长整型:%d\n", sizeof(d));///8
	return EXIT_SUCCESS;//同 return 0;
}

unsigned int 32为全为1,取值范围:0~4294967295

2.3 sizeof关键字
sizeof不是函数,所以不需要包含任何头文件,它的功能是计算一个数据类型的大小,单位为字节
sizeof的返回值为size_t
size_t类型在32为操作系统下时unsigned int,是一个无符号的整数
sizeof(数据类型) sizeof(变量名)

#include<stdio.h>
int main()
{
	int a;
	int b = sizeof(a);//sizeof得到指定值占用内存的大小 单位:字节
	printf("b=%d\n", b);
	size_t c = sizeof(a);
	printf("c=%u\n", c);//用无符号的方式输出c的值
	return 0}

2.4 字符型:char
2.4.1 2 字符变量的定义和输出 输入
字符型变量用于存储一个单一字节,在C语言中用char表示,其中每个字符变量都会占用1个字节。在给字符型变量赋值时,需要用一对英文半角格式的单引号 ’ ’ 把字符括起来。
字符变量实际上并不是把该字符本身放到变量的内存单元中去,而是将该字符对应的ASCII码放到变量的存储单元中。char的本质就是一个1字节大小的整型。

#include<stdio.h>
int main05()
{
	//字符型变量
	char ch = 'a';
	//打印字符型变量
	printf("%c\n", ch);
	//打印字母a对应十进制数
	print("%d\n", ch);
	printf("字符型大小: %d\n", sizeof(ch));//1
	return EXIT_SUCCESS;
}
int main()
{
	//char ch1 = 'a';
	//char ch2 = 'A';
	//printf("%d\n", ch1 - ch2);

	char ch;
	scanf("%c", &ch);//注意 不要加\n
	printf("%c\n", ch-32);//小写字母转换大写字母
}

2.4.3 ASCII对照表
‘0’48 ‘A’65 ‘a’97

2.4.4 转义字符
注:红色字体标注的为不可打印字符。
在这里插入图片描述
打印%需要%%:30%%–>30%

2.5 实型(浮点型):float、double
实型变量也可以成为浮点型变量,浮点型变量是用来存储小数数值的。在C语言中,浮点型变量分为两种:单精度浮点数(float)、双精度浮点数(double),但是double型变量所表示的浮点数比float型变量更精确。
由于浮点型变量是由有限的存储单元组成的,因此只能提供有限的有效数字。在有效位以外的数字将被舍去,这样可能会产生一些误差。
不以f结尾的常量是double类型,以f结尾的常量(如3.14f)是float类型。

#include<stdio.h>
int main05()
{
	float a = 3.14f;//3.14F
	double b = 3.14;
	printf("%f", a);
	printf("%lf", b);
	return EXIT_SUCCESS;

	//sizeof字节大小
	//浮点型数据 存储在内存中的格式分为 符号位 指数位 小数位
	printf("%d\n", sizeof(a));\\4
	printf("%d\n", sizeof(b));\\8
}
int main(void)
{
	int a = 10;
	float b = 3.14;
	printf("%p\n", &a);
	printf("%p\n", &b);

	//科学计数法
	c = 3.2e3f;//3.2*1000=3200,e/E
	printf("%f\n", c);
	d = 100e-3f;//100*0.001=0.1
	printf("%f\n", d);
	e = 3.1415926f;
	printf("%f\n", e);//3.141593
	f = 3210.2;
	printf("%e\n", f);//3.2102e+03
	g = 0.123456;
	printf("%e\n", g);//1.234560e-01
	return 0;
}

& 取地址
%p 输出一个变量对应的内存地址编号(无符号十六进制整型数),如果输出数据不够8位,则左边补零
%p是打印地址的, %x是以十六进制形式打印, 完全不同!另外在64位下结果会不一样, 所以打印指针用%p .
%e 是表示输出的数字以科学计数显示

2.6 进制
进制也就是进位制,是人们规定的一种进位方法。对于任何一种进制——X进制,就表示某一位置上的数运算时是逢X进一位。十进制是逢十进一,十六进制是逢十六进一,二进制就是逢二进一,以此类推,x进制就是逢x进位。
2.6.1 二进制
二进制是你计算机技术中广泛采用的一种数制。二进制数据是用0和1两个数码来表示的数。它的基数为2,进位规则是“逢二进一”,借位规则是“借一当二”。
不同进制相互转换
十进制–>二进制:除2反序取余法
二进制–>十进制:权值法 将一个二进制依次从末尾开始乘2的n次幂 n从0开始
十进制–>八进制:除8反序取余法
八进制–>十进制:权值法
十进制–>十六进制:除16反序取余法
八进制–>十进制:权值法

8421法则
在这里插入图片描述
十进制的小数转换成二进制:小数部分和2想成,取整数,不足1取0,每次相乘都是小数部分,顺序看取整后的数就是转化后的结果。
在这里插入图片描述
当前的计算机系统使用的上是二进制系统,数据在计算机中主要以补码的形式存储的
bit(比特):一个二进制代表一位,一个位只能表示0或1两种状态,数据传输是习惯以“位”(bit)为单位
Byte(字节):一个字节为8个二进制,成为8位,计算机中存储的最小单位是字节。数据存储是以“字节”(Byte)为单位
WORD(双字节):2个字节,16位
DWORD:两个WORD,4个字节,32位
1b:1bit,1位
1B:1Byte,1字节,8位
1k,1K:1024
1M(1兆):1024k,10241024
1G:1024M
1T:1024G
1Kb(千位):1024bit,1024位
1KB(千字节):1024Byte,1024字节
1Mb(兆位):1024Kb=1024
1024bite
1MB(兆字节):1024KB=1024*1024Byte

2.7 计算机内存储数据方式
2.7.1 原码
一个数的原码(原始的二进制码)有如下特点:

  • 最高位最为符号位,0表示正,1表示负
  • 其他数值部分就是数值本身绝对值的二进制数
  • 负数的原码是在其绝对值的基础上,最高位变为1
    下面数值以1字节的大小描述:
    十进制数 原码
    +15 0000 1111
    -15 1000 1111
    +0 0000 0000
    -0 1000 0000
    原码不利于存储
    原码表示法简单易懂,与带符号数本身转换方便,只要符号还原即可,但当两个整数相减或不同符号数相加时,必须比较两个数哪个绝对值大,才能决定谁减谁,才能确定结果是正还是负,所以原码不便于加减运算。

2.7.2 反码

  • 对于整数,反码与原码相同
  • 对于复数,符号位不变,其他部分取反(1变0,0变1)
    十进制数 反码
    +15 0000 1111
    -15 1111 0000
    +0 0000 0000
    -0 1111 1111
    反码运算也不方便,通常用来作为求补码的中间过渡。

2.7.3 补码
在计算机系统中,数值一律用补码来存储。
补码特点:

  • 对于整数,原码、反码、补码相同
  • 对于负数,补码=反码+1
  • 补码符号位不动,其他位求反,最后整个数+1,得到原码
    十进制数 补码
    +15 0000 1111
    -15 1111 0001
    +0 0000 0000
    -0 0000 0000
    在这里插入图片描述
    在计算机系统中,数值一律用补码来存储,主要原因:
  • 统一了零的编码
  • 将符号位和其他位统一处理
  • 将减法运算转变为加法运算
  • 两个用补码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃

2.7.4 有符号和无符号取值范围
有符号数:最高位为符号位,0整数 1负数
无符号数:最高位不是符号位,而是数的一部分,无符号数不可能是负数
当我们写程序要处理一个不可能出现负值的时候,一般用无符号数,这样可以增大数的表达最大值。

8bit数据最大存储值为
原码:0111 1111 2^7-1=127
最小值:
原码:1111 1111 -127
反码:1000 0000
补码:1000 0001 = -127
1000 0000 -0 = -128
-128原码:11000 0000
数据存储时将-0对应的区间值设为最小值 -2^7

有符号字符型(signed char,8bit数据 1字节):区间为-2^7 ~ 2^7-1,-128~127
int(32bit):-2^31 ~ 2^31-1,-2147483648~2147483647
long(64bit):-2^63 ~ 2^63-1

无符号 数据存储在计算机中不存在符号位
无符号字符型(unsigned char 1字节):1111 1111 0 ~ 2^8-1,0~255
unsigned int:2^32-1 4594967295
在这里插入图片描述
2.7.5 数值溢出
当超过一个数据类型能够存放最大的范围时,数据会溢出。
有符号位最高位溢出的区别:符号位溢出会导致数的正负发生改变,但最高位的溢出会导致最高位丢失。

#include<stdio.h>
int main06()
{
	char ch = 127;
	ch = ch + 2;
	printf("%d\n", ch);
	return 0;
}

在这里插入图片描述
2.8 类型限定符
在这里插入图片描述
volatile小写:volatile int num;

2.9 字符串格式化输入和输出
2.9.1 字符串常量

  • 字符串是内存中一段连续的char空间,以’\0’(数字0)结尾
  • 字符串常量是由双引号括起来的字符序列,“china”、“C program”、"$12.5"等都是合法的字符串常量。
    字符串常量与字符常量不同:
    ‘a’为字符常量,"a"为字符串常量
    在这里插入图片描述
    每个字符串的结尾,编译器会自动添加一个结束标志位’\0’,即"a"包含两个字符’a’和’\0’。
    %s string字符类型占位符 遇\0停止
#include<stdio.h>
int main07()
{
	char a = 'a';
	char * b = "hello world";
	printf("%s\n", b);//hello world
	char * c = "hello\0 world";
	printf("%s\n", c);//hello
	return 0;
}

2.9.2 printf函数和putchar函数
printf是输出一个string字符串,putchar是输出一个char字符。
printf格式字符:
打印格式 对应数据类型 含义
%d int 接收整数值并将它表示为有符号的十进制整数
%hd short int 短整数
%hu unsigned short 无符号短整数
%o unsigned int 无符号8进制整数
%u unsigned int 无符号10进制整数
%x,%X unsigned int 无符号16进制整数,x对应abcdef,X对应ABCDEF
%f float 单精度浮点数
%lf double 双精度浮点数
%e,%E double 科学计数法表示的数,此处"e"的大小写代表在输出时用的"e"的大小写
%c char 字符型,可以把输入的字符按照ASCII码相应转换为对应的字符
%s char * 字符串,输出字符串中的字符直至字符串中的空字符(字符串以‘\0’结尾,这个’\0’即空字符)
%p void * 以16进制形式输出指针
%% % 输出一个百分号

printf附加格式:
在这里插入图片描述

#include<stdio.h>
int main08()
{
	int a = 10;
	printf("===%-5d===", a);//===10   ===  整体数据一共占5位,后面空3个
	printf("===%5d===", a);//===   10===  整体数据一共占5位,前面空3个,默认右对齐
	printf("===%05d===", a);//===00010===  整体数据一共占5位,前面3个用0补齐,默认右对齐,只能前面补0
	
	int b = 123456;
	printf("===%5d===", c);//===123456===  大于设置范围正常显示,小于填充

	float c = 3.14;
	printf("===%7.2f===", c);//===   3.14===  整体宽度7,.2小数点宽度多少位,小数点占1位
	return 0;
}
int main()
{
	char ch = 'a';
	printf("%c\n", ch);
	//输出字符
	//putchar(ch);//输出字符变量
	putchar('B');//输出字符
	putchar(97);//输出数字 0-127
	putchar('\n');//输出转义字符
	return 0;
}

2.9.3 scanf函数和getchar函数
getchar是标准输入设备读取一个char
scanf通过%转义的方式可以得到用户通过标准输入设备输入的数据

#include<stdio.h>
int main08()
{
	//char ch;
	//scanf("%c", ch);
	//putchar(ch)
	int a,b;
	scanf("%d, %d", &a, &b);//scanf以 \n为结束符,中间不能有\n,以逗号为分隔符
	putchar("%d\t%d". a, b);

	int a,b;
	scanf("%3d, %d", &a, &b);//123456
	putchar("%d\t%d". a, b);//自动分隔为123	456,只能针对整型使用 浮点型不可以
	return 0;
}
int main()
{
	char ch;
	//接收键盘获取字符
	ch = getchar();
	putchar(ch);//输入abc,输出a一个字符
	//暂时停留界面
	getchar();
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值