目录
C语言的说明:
1.c语言的本质是操作内存。
2.c语言在使用使需要包含头文件
包含头文件的方法在.c源文件的第一行写入: #include<stdio.h>
他的意义是把stdio.h文件中的所有内容都输入在该行所在的位置,他是标准输入\输出头文件
#include<stdio.h>
int main(){
printf("This is a simple program");
return 0;
}
//程序中的#include是一条预处理指令,表示编译器在编译前对源代码做出的一些准备操作
//main()是函数的入口,在一个完整的程序中main()函数有且只能有一个,并且c程序一定是从main函数
//开始执行的
一.数据类型:
1.1基本数据类型:
基本数据类型可分为:char short int long long long,其中这里面的每一种元素有分为有符号(signed)和无符号(unsigned)。C语言中默认的是有符号数。
字符类型:char在内存中中占1个字节。
短整型: short在内存中占2个字节。
整型: intt在内存中占4个字节。
长整型: long int t在内存中占4个字节(32位系统中)。
长整型: long int t在内存中占8个字节(64位系统中)。
长长整型: long int t在内存中占8个字节。
例如:
int name; //这个是变量的声明,他的意思是定义了一个名为name的变量,类型为int(整数)
name=1; //赋值表达式,在声明变量的时候操作系统会给变量分配一块内存空间,执行name=1的
时候是将数字1存储到了这片内存空间中。
说明:剩余的char, short,long等类型的使用与int相同
1.2空类型:
空类型void 一般不单独使用,在实际开发过程种多用于配合指针使用。
1.3构造类型:
构造类型可分为:数组,结构体(struct),共用体(union).
1.4浮点型:
float 为单精度浮点型,在内存中占用4个字节。
double为双精度浮点型,在内存中占用8个字节。
1.5字符串
c语言中没有专门存储字符串类型的数据类型,字符串是被存储在char类型的数组中,由于数组是
由连续的存储单元组成,所以字符串中的字符是被存储在相邻的存储单元中。字符串以 '\0'结尾
解释:
数组:数组是同类型数据元素的有序序列.
例如:
char name[40];//表示的是申请创建了一个可以存储40个字符的连续的一个char类型的数组。
//[40]表示数组中元素的数量,char表示数组中存储元素的类型。
下面以一个小例子说明:
#include<stdio.h>
int main(){
char name1[32]="zhangsan";
char name2[32]="李四";//每个汉字占四个字节
printf("%s %s\n",name1,name2);
printf("%ld\n",sizeof(name1));//查看数组的长度,为32
printf("%ld\n",sizeof(name2));//查看数组的长度,为32
return 0;
}
/*
说明:
程序中创建了两个数组name1,name2,每一个数组在内存中都占据32个连续的储存单元由
于name1数组中只初始化了0-8各元素,下标为8的数据元素存储的值是字符串的结尾 '\0',
name下标为9-31的元素将被自动初始化为0。
name2同理
*/
/*使用printf("%s", name1)时,name1会被解释为数组的首地址,并按照字符串的格式
输出从该地址开始的字符序列,直到遇到空字符('\0')为止。*/
1.5.1字符串个字符的区别:
字符'x'与字符串"x"的区别,首先字符'x'是一个char类型的字符。而"x"是一个字符串,它是
有字符'x'与'\0'组成的
二.常量
2.1 概念
顾名思义常量就是值不允许改变的量。常量存储在常量区中,常量区的内容不允许修改。
2.2常量分类
整型常量 :在函数输出结果时,整型常量又分为二进制常量,八进制常量(以%#o的形式进行输出),
十进制常量(以%d的形式进行输出),十六进制常量(以%#x的形式进行输出)。
字符常量:以%c的形式输出
浮点型常量:单精度浮点型常量float(以%f的形式进行输出)
双精度浮点型常量double(以%lf的形式进行输出)
字符串常量:以%s的方式进行输出
指数常量: 以%e的方式进行输出
标识常量 :标识常量使用宏定义的方式进行声明,在程序的预处理阶段完成替换。宏定义只是一个
简单的替换。
标识常量定义的格式: # define 宏名 宏值
三.变量
3.1概念
变量顾名思义就是它的值可以在程序运行阶段进行改变
3.2定义
存储类型 变量类型 变量名;
存储类型:const static extern register volatile auto
由const修饰的局部变量,它的值不允许通过变量名进行修改。可以通过指针进行修改该变量的
值(意义不大),const修饰的全局变量存放在。rodata段则不允许修改。
由static 修饰的局部变量,局部变量的生命周期会发生改变,生命周期从最近的{}结束延
长到整个.c文件,但是它的作用域未被改变。
由extern修饰的全局变量,全局变量的作用域会发生改变。该全局变量只能在它所在的.c源
文件中有效,在其他.c源文件中不能通过 extern (以后会详细说明)关键字进行访问该变量。
由register修饰的变量是存放在寄存器中的,该变量不能够取地址。
由volatile修饰的变量表示能能通过访问内存的方式进行存取该变量。
由auto修饰的变量是一个自动类型的变量,局部变量默认的存储类型时auto类型。
非自动类型的变量:全局变量,由static修饰的变量。
3.3变量一些浅显的理解
程序在执行期间操作系统会给变量分配内存空间,如果程序出了这个变量的作用域,那么
操作系统就会回收给这个变量分配的内存空间。变量在使用时需要进行初始化。
3.4 类型转换
在一般情况下 类型小的强制转换成类型大的是不会出现问题的,但是大的类型强制转换成
小的是会损失精度。
注意:强转不会改变变量自身的类型 变量的类型只和定义时有关
四 .运算符
运算符主要连接的是表达式。
运算符主要有:+ (加) ,-(减) , * (乘) ,/(除), %(取余),++(自增),
--(自减)。
关系运算符: > < >= <= == !=
赋值运算符: = += -= *= 。 (复合赋值运算符)
逻辑运算符: && (逻辑与) || (逻辑或) ! (取非)
逻辑运算符是连接多个表达式的,逻辑运算符的运算结果是bool类型的
多个表达式使用&&连接时,只要有一方为假那么整个表达式的结果就是假。只有表达式的结果都
是真时,整个表达式的结果才是真。
使用逻辑或 || 连接表达式时,只要有一方表达式的结果为真那么整个表达式的结果就为真。
只有所有表达式的结果为假才是假。
位运算符: & (按位与)| (按位或) ^(异或)
&在这里是一个操作符 ,在运算时操作系统会把内容转换成二进制 ,然后按照全1为1 ,有0
为的操作进行运算。
例如: int a=3; int b=4; int c=a&b
a 0 0 0 0 0 0 1 1
b 0 0 0 0 0 1 0 0 进行按位与运算
----------------------------------
0 0 0 0 0 0 0 0 --------> c=0
同理:
| 按位或,按位运算,有1为1,全0为0
^ 按位异或,按位运算,不同为1,相同为0
五.运算符优先级
例题:
执行下列程序段后,变量a,b,c的值分别是
int x=10,y=9;
int a,b,c;
a=(--x==y++)?--x:++y;
b=x++;
c=y;
执行步骤:
1.操作系统先给变量x,y分配空间,然后初始化变量x,y
2.操作系统先给变量x,y分配空间,未初始化。
3.这一步按照运算符优先级先执行 () 内的内容。
4.自增,自减运算符优先级在()后。
5.开始执行 --x 操作
6.然后与y进行比较看结果是真还是假,比较完后y进行自增操作
7.为真则进行--x的操作后把值赋值给a,为假则先进行++y的操作然后赋值给a;
8.后面就不解释了
后面会优化笔记