一、C语言简单讲解
1.1 代码注释
方式1:注释一行 //.... 方式2:注释多行 /* ... */ 方式3:注释很多 #if 0 ... #endif
1.2 中英文切换
预装搜狗,ctrl + space
1.3 代码讲解
// #:预处理指令,在gcc编译的第一个阶段就会执行的东西 // #include :要包含的头文件,要使用哪个函数,就需要包含声明所在的头文件 // <>:用来包含头文件,也可以使用"" // stdio.h:标准输入输出头文件,printf函数就是在这个头文件中声明的 #include <stdio.h> //int:整数类型,放在这里代表函数的返回值类型 //main:函数名,主函数,是所有函数的入口函数,一个程序只能有一个主函数,而且必须有 //():里面存放参数 //{}:用来包含这个函数的代码(函数体) //函数中每一行代码执行的末尾必须加上; int main(int argc,char *argv[]) { //printf:向终端格式化输出内容(此处为字符串) //\n:换行 printf("hello world!\n"); //return:返回值,返回函数执行的结果 //0:返回的值,这个值的类型与返回值类型一致 //main函数里面返回0实际上是告诉linux内核这个程序执行完毕了 return 0; }
gcc编译出现问题的解决方式
正确编译:编译完成后没有任何现象
出现警告:警告还是会生成可执行文件,一般的警告可以忽略不管,但是能处理的还是要处理
出现错误:出现错误就不会生成可执行文件,必须要处理,可以根据出错的行数找到出错的位置,一般就是在这一行的上下行出现问题了。
少加分号,会提示哪一行出问题了:标点符号使用中文会报错:
二、 计算机的数据表示
分类:
数值型数据
非数值型数据
数值型数据
数值型数据的表示方法:二进制,十进制,八进制,十六进制
1.二进制
由0和1表示的数据称之为二进制数据,使用前导符0b
例如:0b1001101001
2.十进制
由0-9表示的数据称之为十进制数,我们人类所识别的就是十进制数
例如:256 二进制转十进制: 0b11011 --->1*2^0 + 1*2^1 + 0*2^2 + 1*2^3+1*2^4 = 27 十进制转二进制 凑数或这除商取余倒着往上数
3.八进制
由0-7组成的数称之为八进制数,使用0作为前导符
例如:0756 八进制转十进制: 0627:--->7*8^0 + 2*8^1 + 6*8^2 = 407 八进制转二进制:一位八进制用三位二进制表示 0627:--->0b110010111 二进制转八进制:将二进制从右往左每三位转化位八进制 0b 10 100 010 001 110 -->024216
4.十六进制
由0-9和a-f组成的数称之为十六进制数,使用0x作为前导符
例如:0xa6bd 十六进制转十进制: 0xa6bd --->13*16^0 + 11*16^1 + 6*16^2 + 10 *16^3 十六进制转二进制:一位十六进制数用四位二进制来表示 0xa6bd --->0b1010011010111101 二进制转十六进制:从右往左取四位转为十六进制 0b 0001 1001 0010 0110--->0x1926
非数值型数据
理论上,非数值型数据计算机时不能识别的,因为计算机只能识别二进制码,也就是数值型数据,但是在写代码的过程中,还需要非数值型数据,所以别人就规定了,每一个非数值型数据都会用一个数值型数据来表示,表示方法称之为ascii,我们将非数值型数据也称之为字符。
使用man ascii可以查询 '\0':----> 0 '\n':---->10 '0' - '9':----> 48 - 57 'A' - 'Z':----> 65 - 90 'a' - 'z':----> 97 - 122
三、词法符号
任何高级语言都有自定义的词法符号和支持的数据类型,词法符号是语言的基本组成单位,数据类型是数据的基本属性,词法符号是程序设计语言中有若干个字符组成的有意义的最小语法单位,按照词法符号在冲虚中的作用:
可分为:关键词,标识符,分隔符,运算符和标点符号,词法符号但凡涉及单词,严格区分大小写。
3.1 关键词
关键词是由系统预定义的词法符号,有特定的含义,不允许用户重新定义,必须都是小写,可以直接使用
char short int long float double enum struct union void signed unsigend 12个 auto register const static volatile extern 6个 typedef 1个 sizeof 1个 if else switch case default for while do goto return break continue 12个
3.2 标识符
标识符就是给代码中一些常用的东西取名字,例如:变量名,函数名,结构体名,宏定义名,取别名,且这些名字最好与要表示的东西的含义一样。
标识符的命令规则: 只能由数字,字母,下划线(_)组成 第一个字符不能是数字 不能与关键词相同 注:c语言中,关键词和标识符都严格区分大小写
3.3 分隔符
分隔符主要用于分隔其它的词法符号
主要包括: 空格符,制表符,执行符号,注释,通过对分隔符的恰当运用,使得代码的外观清晰简洁易读,易于分析语法错误
3.4 运算符
运算符是表示运算的词法符号,c语言有着丰富的运算
按照功能分: 算术运算符,逻辑运算符,关系运算符,位运算符,赋值运算符,自增自减运算符,地址运算符,逗号运算符 sizeof运算符
3.5 标点符号
逗号,分号,冒号,花括号,圆括号,标点符号的作用和分隔符类似,但是用法有明确的语法规定,有些标点符号 出现在表达式中时,当作运算符使用。
四、数据类型
数据类型 1.基本类型: 1>:整形:short,int,long,long long 有符号:signed 无符号:unsigned 2>:字符型:char 3>: 实型:float double 4>: 枚举类型:enum 2.构造类型 1> 结构体 struct 2> 共用体 union 3.指针类型 4.空类型 void 逻辑类型 只有两个量true和lfalse ,表示逻辑真和逻辑假
4.1 逻辑类型bool类型
#include <stdio.h> #include <stdbool.h> int main(int argc, const char *argv[]) { //定义一个bool类型的变量并赋值为10 //注意:c语言默认不支持bool类型,需要使用_Bool或者添加头文件stdbool.h //bool类型只有两个值0和1,非0即为真,所有所有非0的值都等于1 //bool类型主要用判断语句,判断条件是否成立 bool b = 10; //%d:有符号整型输出 printf("b = %d\n",b); bool c = 0; printf("c = %d\n",c); bool d = 0.0000000001; //%d:有符号整型输出 printf("d = %d\n",d); _Bool e = 23456879; printf("e = %d\n",e); return 0; }
4.2 整数类型
4.2.1 char
char类型占一个字节
有符号:char或者 signed char
取值范围:-2^7 - 2^7-1 —> -128 - 127
无符号: unsigned char
取值范围:0 - 2^8-1 --> 0 - 255
4.2.2 short
short类型占两个字节
有符号:short或者 signed short
取值范围:-2^16/2 - 2^15-1 —> -32768 - 32767
无符号: unsigned short
取值范围:0 - 2^16-1 --> 0 - 65535
4.2.3 int
int类型占四个字节
有符号:int或者 signed int
取值范围:-2^32/2 - 2^31-1 —> -2,147,483,648 - 2,147,483,647
无符号: unsigned int
取值范围:0 - 2^32-1 --> 0 - 4,294,967,295
4.2.4 long
long类型在32位操作系统占四个字节,在64位操作系统占8个字节
有符号:long或者 signed long
取值范围:-2^64/2 - 2^63-1
无符号: unsigned long
取值范围:0 - 2^64-1
#include <stdio.h> int main(int argc, const char *argv[]) { //定义一个char类型变量并赋值 char a = 100; printf("a = %d %c\n",a,a); short b = 20000; printf("b = %d\n",b); int c = 34253452; printf("c = %d\n",c); //如果是long类型,要用%ld输出 long d = 12345678998765; printf("d = %ld\n",d); return 0; }
4.3 浮点类型
浮点类型也叫做实型,就是带有小数点的数据
float 单精度 占4个字节
double 双精度 占8个字节
#include <stdio.h> int main(int argc, const char *argv[]) { //float类型输出变量要使用%f //float类型默认保留小数点后6位,并且会四舍五入 float a = 3.141592653; printf("a = %f\n",a); float b = 5.6; printf("b = %f\n",b); //如果一个浮点数数据非常大,末尾小数可能会丢失精度 float c = 234567864.999; printf("c = %f\n",c); double d = 24.23456122; printf("d = %lf\n",d); return 0; }
4.4 数据在计算机中的存储
我们人为设置的数据称为原码
存储在计算机中的数据称为补码
为了实现原码和补码的转换,加入了反码
存储数据的顺序:原码—>反码---->补码
取出数据的顺序:补码—>反码---->原码
如果一个数是正数,原码 反码 补码都一样
如果一个数是负数,最高位为符号位,符号位为1表示负数
负数的反码等于原码取反(将这个数转化为二进制之后,原本1变成0,0变成1,),但是符号位不便,补码等于反码加1.
技巧:存储时看数据,取出时看类型
unsigned char = 100; 存储时: 原码:0110 0100 反码:0110 0100 补码:0110 0100 取出时: 补码:0110 0100 反码:0110 0100 原码:0110 0100 = 100 signed char = -10; 存储时: 原码:1000 1010 反码:1111 0101 补码:1111 0110 取出时: 补码:1111 0110 反码:1111 0101 原码:1000 1010 signed char = 129; 存储时: 原码:1000 0001 反码:1000 0001 补码:1000 0001 取出时: 补码:1000 0001 反码:1000 0000 原码:1111 1111 = -127
五、常量
常量是指在程序在运行期间其数值不会发生变化的数据
5.1 整数常量
十进制: %d
八进制:%#o
十六进制:%#x
#include <stdio.h> int main(int argc, const char *argv[]) { int num = 1000; printf("num = %d\n",num); printf("num = %#o\n",num); printf("num = %#x\n",num); int a = 0756; int b = 0xab8f; int c = 0b100011110; printf("a = %d, %#o %#x\n",a,a,a); printf("b = %d, %#o %#x\n",b,b,b); printf("c = %d, %#o %#x\n",c,c,c); return 0; }
5.2 浮点型常量和指数常量
float:%f
double: %lf
指数常量就类似于科学计数法:
678900---->6.789*10^5---->6.789e+5 //使用%e输出指数常量
指数常量的格式:<+/->m.ne<+/->i; 例如:-3.14*10^-7 ---->-3.14e-7
#include <stdio.h> int main(int argc, const char *argv[]) { float a = 345568.123; printf("a = %f\n",a); printf("a = %e\n",a); float b = -1.78e-5; printf("b = %f,%e\n",b,b); return 0; }