一、C语言基本语法
1)整形
(1)int C语言语法内置关键字
数据类型可以用来定义变量的,变量名就是空间的表示。
整形变量的定义:
申请合法内存空间,申请空间是为了存放数据。(程序是由代码写出来之后编译生成的,程序就是由多种数据组成的,所以程序需要数据,那么数据需要的是变量 )
用法: int 变量名字; (变量名字叫做标识符,标识符有命名规则:由数字,字母,下划线组成,开头不能是数字).
整形变量的赋值:
用法: 变量名 = 数据值; (数据拷贝,大文件传输,其实内部原理就是:数据的赋值原理,内部代码就是通过一个=实现的)
整形变量的输出:
调用一个C语言标准库提供的函数(库函数):printf
整形变量的初始化
初始化:定义并且赋值一般情况下:先定义之后再赋值,如果是初始化只需要一条式子即可
例如:
int data = 100;
int a = 1,b = 2;
在函数里定义的变量,一般称为局部变量,如果局部变量没有初始化也没有赋值,那么的存放的值是随机值。
在函数外面定义的变量,称为全局变量,如果全部变量没有初始化也没有赋值,那么的存放的值是0。
整形变量中的数据在内存中的存放方式和所占内存大小
整形数据在机器中是以补码的形式存放的,补码是二进制方式的数据。
整形数据是以补码的形式存放在运行内存里面的。
一个整形变量:大小
系统:
16位:2个字节
32位:4个字节
64位:4个字节
整型数据在内存中的存放形式是补码形式存放的,但是补码需要通过原码求出来。 二进制:1111 1x2的3 + 1x2的2 +1x2的1次 + 1x2的0 8+4+2+1
原码:正数的原码就是自己的数据值转成二进制。
负数的原码:符号位不变(1),数据位是他的绝对值的二进制,int data_a = -3; 1 000000000....11 1 111111111....01
补码: 正数的补码:它本身的原码
负数的补码:它本身的原码取反(也就是他的反码),再+1
反码: 符号位不变,数据位0变1,1变0
如:
int data = 3;//默认是有符号的,也可以写成 signed int data_a;
总共是32个位(int占4个字节,每个字节8比特),因为这个整型变量是有符号的,所有最高位(最左边的那个位是符号位),剩下的为31数据位,最低两位为11,剩下的都是0
最高位是符号位:表示正负之分(0:正 1:负),不存放数据,所以int有符号的取值范围是 -2的31次方 ~ 2的31次方-1
3的
源码 000000000....11
反码 011111111....00
-3的
源码 100000000....11
反码 111111111....00
补码
正数的补码是自己的源码
负数的补码是反码+1
定义一个变量,unsigned int data_a,那么就改变了取值范围变为 0~2 的32次方-1;
signal int a(就是int a,默认是有符号)称为有符号整型,可以存放正数和负数,
unsignal int a称为无符号整型,只能存放正数,所以没有符号位,而是32个数据位。
注意:科学计数法e或者E表示的是浮点数
10E2,用科学计数法算出来的就是浮点数
补充:有符号和无符号的区别:
无符号的就是无正负之分之能存放正数整数,所以它没有符号位,也就是他有32个数据位他的正数的取值范围是有符号的两倍。
有符号的整数范围:-2的31~2的31次方-1无符号的整数范围:0~2的32次方无符号变量可以用%u输出但是默认是十进制输出!
(2)short 短整型
定义 有符号短整型:
signed short data; 默认 short data;即可 最完整的写法: auto signed short int data;
定义 无符号短整型:
unsigned short data;原理是一样的,无符号取值范围是有符号正数范围的两倍。其定义赋值和初始化和int一样关于定义一个有符号的短整型,
默认的情况下,局部变量都是自动化变量
短整型的的输入输出格式
有符号十进制:%hd
无符号整形(所有的进制):%hu
有符号八进制和十六进制: %ho %hx
总结
基本类型存放形式: int char long short 原码: 负数: 符号位是1,数据位是他的绝对值的二进制 正数: 符号位是0,数据位就是他的二进制形式 补码 : 正数: 他的原码就是他的补码 负数: 反码+1 反码: 符号位不变,数据位0变1,1变0
整型:
输出%d 输入%d
64位和32位大小:4个字节
短整型:
输出%hd 输入%hd
大小:2个字节
长整型:
输出:%ld 输入:%ld
大小: 64位:8个字节 32位:4个字节
进制数: 输入:%d %o %x 输出:%d %o %x
(3)long 整形
定义赋值初始化 :long int data; 长整型定义变量的完整格式(局部变量):auto signed long int data;
输出格式:
有符号: 十进制 :%ld 八进制 :%lo 十六进制:%lx
无符号长整型: %lu
变量是表示一块内存空间,所以变量是用来存放常量数据.空间是由地址组成的(4个字节由4个地址组成),所有内存中的所有变量都有自己的地址. 变量是用来表示空间的。空间由地址组成。
地址的输出格式是%p,这个%p只能用于输出。指针就是地址,地址就是指针
2)浮点型
单精度float 双精度double
定义赋值:
单精度float a;
双精度double a;
输入输出格式:
float : 输入输出格式为%f
double: 输入输出格式为%lf,但是输入一定要lf (scanf),输出可以用%f,flaot的取值范围比double小
long double: 输入输出为%Lf
各个类型输入输出格式统计
E表示科学计数法: 这种数据默认是什么类型:浮点型,E的后面是整数
如 2E3:表示2X10的3次方(标准写法:2E+03)
3)字符型
char 字符数据=字母 + 符号 + 数字字符 +转义字符 'a' ',' '1' '\n'
字符变量的定义: char char_data;
字符变量的赋值: char_data = ','; //字符常量
字符变量的初始化: char char_data = 's';
取值范围: -2的7次方 ~ 2的7次方-1 , 发现取值范围有是和数字有关
char a = 'S'; //s的数据怎么存放在内存中,因为内存只能存放0或者1对于字符,字符有对应的ascii表:设置字符数据的存放格式和表达方式。
ascii表明,每一个字符都有自己的 字符表达+十进制表达+八进制表达+十六进制表达,所以字符类型和整形可以互相转换表示
如以下代码:
#include <stdio.h>
int main()
{
int int_a = 96;
char char_b = 'a';
printf("%c\n",int_a);
printf("%d\n",char_b); //96
return 0;
}
字符和整形相互转换表达
转义字符 转义字符只占一个字节
4)布尔类型
bool 是C语言内置语法
布尔变量只有两种情况,用来判断真和假 (非0即真)
真:true表示 1
假:false表示 0
#include <stdio.h>
#include <stdbool.h> //使用布尔变量需要包含的头文件
//变量名叫做标识符:有命名规则:数字 字母 下划线组成,开头不能是数字
int main()
{
int num; //这份代码就是实现判断num这个数是不是偶数
bool mask; //定义一个布尔变量
printf("请先输入一个数进行判断:");
scanf("%d",&num);
if(num % 2 == 0)
{
mask = true; //用true表示 num是偶数
}
else
{
mask = false; //用false表示 num不是偶数
}
if(mask == true)
{
printf("num是偶数!\n");
}
if(mask == false)
{
printf("num不是偶数!\n");
}
printf("布尔变量的大小:%d个字节\n",sizeof(mask));
}
PS:操作系统中内存最小的基本单位是字节。
5)数据类型计算大小
计算数据类型或者变量的大小我们可以用杂项运算符来帮我们计算:sizeof
一个bool变量是一个字节
总所周知,一个bool变量是一个字节,但是bool里面只能放1或者放0,一个位的空间就够了,为什么要申请一个字节?
常见的操作系统对数据的控制,最小是以一个字节来控制的。
1关于sizeof: 他是帮我们计算数据类型的字节长度,是有数据类型的
6)数据类型转换
很重要(写项目)
自动转换(隐式转换 --- 编译器在编译代码的时候自动帮你转的),低精度 自动转高精度
char ---》 short ----》 int ---》 long ---》 double 低精度 --》 高精度
混合运算:
int a=1;
float b = 2;
a+b-a*b+a是float
所以printf("%f\n",a+b-a*b+a);
赋值运算: =右边的类型会自动转成左边的类型
float b = 2.45;
int a = b; //这里的类型转换是常量的类型转换并不是变量的类型转换
printf("%d\n",a);
注意: 低精度转高精度:取值范围变大,好! 占用内存变大。
高精度转低精度:取值范围变小,数据可能会丢失,不好! 占用内存变小。
到底要不要类型转换,高变低还是低变高主要看产品.
PS:
强制转换(手动 转换)
第一种强制转换: int a = 11;
printf("%ld\n",(long)a);
第二种强制转换 “提高可读性”
int a = 1;
float b = (float)a;
第三种强制转换 混合运算中的强制转换
int a = 2;
long b = 1;
printf("%d\n",a+(int)b);