各大编程语言的主要用途
C/C++ | C++ 是在C语言的基础上发展起来的,C++ 包含了C语言的所有内容,C语言是C++的一个部分,它们往往混合在一起使用,所以统称为 C/C++。C/C++主要用于PC软件开发、Linux开发、游戏开发、单片机和嵌入式系统。 |
---|---|
JavaScript | JavaScript 最初只能用于网站前端开发,而且是前端开发的唯一语言,没有可替代性。近年来由于 Node.js 的流行,JavaScript 在网站后台开发中也占有了一席之地,并且在迅速增长。 |
Java | Java 是一门通用型的语言,可以用于网站后台开发、Android开发、PC软件开发,近年来又涉足了大数据领域(归功于 Hadoop 框架的流行)。 |
Go语言 | Go语言是 2009 年由 Google 发布的一款编程语言,成长非常迅速,在国内外已经有大量的应用。Go 语言主要用于服务器端的编程,对 C/C++、Java 都形成了不小的挑战。 |
python | Python 也是一门通用型的语言,主要用于系统运维、网站后台开发、数据分析、人工智能、云计算等领域,近年来势头强劲,增长非常快。 |
PHP | PHP 是一门专用型的语言,主要用来开发网站后台程序。 |
Objective-C Swift | Objective-C 和 Swift 都只能用于苹果产品的开发,包括 Mac、MacBook、iPhone、iPad、iWatch 等。 |
汇编语言 | 汇编语言是计算机发展初期的一门语言,它的执行效率非常高,但是开发效率非常低,所以在常见的应用程序开发中不会使用汇编语言,只有在对效率和实时性要求极高的关键模块才会考虑汇编语言,例如操作系统内核、驱动、仪器仪表、工业控制等。 |
C语言的概述
C语言是一门面向过程的、抽象化的通用程序设计语言,广泛应用于底层开发。C语言概念少,词汇少,包含了基本的编程元素,后来的很多语言(C++、Java等)都参考了C语言,说C语言是现代编程语言的开山鼻祖毫不夸张,它改变了编程世界。
C语言是计算机产业的核心语言,也许是机缘巧合,C语言出现后不久,计算机产业开始爆发,计算机硬件越来越小型化,越来越便宜,逐渐进入政府机构,进入普通家庭,C语言成了编程的主力军,获得了前所未有的成功,操作系统、常用软件、硬件驱动、底层组件、核心算法、数据库、小游戏等都使用C语言开发。
软件行业的很多细分学科都是基于C语言的,学习数据结构、算法、操作系统、编译原理等都离不开C语言,所以大学将C语言作为一门公共课程,计算机相关专业的同学都要学习。
C语言被誉为“上帝语言”,它不但奠定了软件产业的基础,还创造了很多其它语言,例如:PHP、Python 等都是用C语言开发出来的,虽然平时做项目的时候看不到C语言的影子,但是如果想深入学习 PHP 和 Python,那就要有C语言基础了。
C++ 和 Objective-C 干脆在C语言的基础上直接进行扩展,增加一些新功能后变成了新的语言,所以学习 C++ 和 Objective-C 之前也要先学习C语言。
c语言大纲
- 基本概念
- 数据类型、运算符和表达式
- 输入输出
- 流程控制
- 数组
- 指针
- 函数
- 构造类型
- 动态内存管理
- 10.工具使用(gdb,make)调试技巧
- 常用库函数
C语言关键字:
auto :声明自动变量
break:跳出当前循环
case:开关语句分支
char :声明字符型变量或函数返回值类型
const :声明只读变量
continue:结束当前循环,开始下一轮循环
default:开关语句中的“默认”分支
do :循环语句的循环体
double :声明双精度浮点型变量或函数返回值类型
else :条件语句否定分支(与 if 连用)
enum :声明枚举类型
extern:声明变量或函数是在其它文件或本文件的其他位置定义
float:声明浮点型变量或函数返回值类型
for:一种循环语句
goto:无条件跳转语句
if:条件语句
int: 声明整型变量或函数
long :声明长整型变量或函数返回值类型
register:声明寄存器变量
return :子程序返回语句(可以带参数,也可不带参数)
short :声明短整型变量或函数
signed:声明有符号类型变量或函数
sizeof:计算数据类型或变量长度(即所占字节数)
static :声明静态变量
struct:声明结构体类型
switch :用于开关语句
typedef:用以给数据类型取别名
unsigned:声明无符号类型变量或函数
union:声明共用体类型
void :声明函数无返回值或无参数,声明无类型指针
volatile:说明变量在程序执行中可被隐含地改变
while :循环语句的循环条件
1999年12月16日,ISO推出了C99标准,该标准新增了5个C语言关键字:
inline restrict _Bool _Complex _Imaginary
2011年12月8日,ISO发布C语言的新标准C11,该标准新增了7个C语言关键字:
_Alignas _Alignof _Atomic _Static_assert _Noreturn _Thread_local _Generic
C语言规范
缩进
每一层代码块需要进行缩进,用tab制表符进行缩进而不是按多个空格
空格
- 逗号“,”后面一般加空格
- 双目和三目运算符与操作数之间加空格(单目运算符和操作数之间一般不加)
- 关键字和自定义标识符之间加空格
换行
- 每一条语句结束一般都换行(除了for循环里面的三个表达式)
- 在变量定义和功能模块之间空行 函数定义之间加空行
- 预处理命令后面一般加空行
- 不同的逻辑代码块之间一般加空行
注释
- 多行注释 /…/
- 单行注释 //
#if 0 注释部分 endif
标识符命名规则
语法要求:
只能以数字、字母、下划线组成(不是说一个名字里面必须包含着三种元素)
不能以数字开头
不能使用C语言的关键字
习惯建议:
“顾名思义”、多个单词组成中间加下划线、普通变量和函数名全小写字符、宏名一般全大写、组合数据类型名一般首字母大写、不要同名。
c语言使用平台
ubuntu20.04,vim编辑,gcc
c语言的编译过程
c源文件—预处理—编译—汇编—链接—可执行文件
gcc -E 预处理
gcc -S编译
gcc -C汇编
gcc 链接
./filrname执行
一般直接gcc filename -o 目标文件名生成可执行文件
再./filrename执行
另一种make
make 目标文件名 自动生成可执行文件
再./filename
12
我的第一条C语言:
//包含stdio.h头文件
#include <stdio.h>
//函数定义
int function(int a)
{
return a+10;
}
//任何的C语言程序都以main函数为入口函数
int main(void)
{
//变量的定义
int a = 100;
//调用printf函数
printf("hello world. a = %d\n", function(a));
//给函数的调用者返回的数据。0表示正常退出,-1表示异常退出
return 0;
}
注:当是 int main() 时,main() 的返回值是 int 类型,所以是 return 0; 现在 C 标准里规定 main() 返回值必须为 int,所以必须写成是 int main()。
当是 void main() 时,main() 的返回值是空,所以可以不写或者是 return; 但这是以前的写法了,现在很少用 void main() 了。
基本概念
- 必须严格包含头文件
- 以函数为单位编写程序
- 声明部分+实现部分
- return 0;
- 合理使用注释和空格、空行
算法:解决问题的方法/步骤(流程图、NS图、有限状机FSM)
程序:用编程语言实现算法
防止写越界,防止内存泄漏,谁打开谁关闭,谁申请谁释放
数据类型,运算符和表达式
数据类型(基本数据类型)
基本类型 | 最主要的特点是,其值不可以在分解为其他类型。也就是说,基本数据类型是自我说明的。 |
---|---|
构造类型 | 根据已定义的一个或多个数据类型用构造的方法来定义的。也就是说,一个构造类型的值可以分解成若干个“成员”或者 “元素“。每个成员都是一个基本数据类型或者又是一个构造类型。在C语言中,构造类型有数组类型、结构体类型、联合体类型。 |
指针类型 | 指针是一种特殊的,同时又是具有重要作用的数据类型。它的值用来表示某个变量在存储器中的地址。虽然指针变量的取值类似于整型量,但这是两个类型不同的量,因此不能相提并论。 |
空类型 | -在调用函数的时,通常应向调用者返回一个函数值。这个返回的函数值是具有一定的数据类型的,应在函数定义及函数说明中给以说明,例如在例题中给出的max函数定义中,函数头为: int max(int a,intb );其中” int “ 类型说明这个函数的返回值为整型量。但是,也有一类函数,调用后并不需要向调用者返回函数值,这种函数可以定义为”空类型“。其类型说明符为void。- |
注意,各种类型的存储大小与系统位数有关,但目前通用的以64位系统为主。
以下列出了32位系统与64位系统的存储大小的差别(windows 相同):
说明:数据类型所占字节数随机器硬件不同而不同。1个字节等于8位
基本数据类型的注意事项:
常量和变量
常量:在程序执行过程中,其值不会发生改变
变量:在程序执行过程中,其值会发生改变
它们可与数据类型结合起来;例如:整型常量,整型变量,浮点常量,浮点变量,字符常量,字符变量,枚举常量,枚举变量等。
常量和符号常量
符号常量:
即 用标识符代表一个常量。
在C语言中,可以用一个标识符来表示一个常量,称之为符号常量。
符号常量在使用之前必须先定义,其一般形式为:
#define
其中,#define 也是一条预处理命令(预处理指令都以”#”开头),称为宏定义命令,
功能:把这个标识符定义为它后面的常量值,一旦定义后,以后的程序中所有出现该标识符的地方均取代该常量值。
习惯 上,符号常量的标识符用大写字母,变量标识符用小写字母,以此来区别
#include<stdio.h>
#define PRICE 15
int main()
{
int number,total ;
number=10;
total = number*PRICE;
printf("总价为:%d",total);
}
符号变量优点:在作用域内,其值不能改变,不能再赋值;含义清楚,一改全改。
变量
变量:其值可以改变的量
一个变量应该有一个名字,在内存中占据一定的存储单元。变量定义必须放在变量使用之前。
一般放在函数体的开头。要区分变量名和变量值是两个不同的概念。
例如:
int a = 3;
a 变量的名称
3 变量的值
0x0010ff 变量的地址
整型常量
即整常数,在C语言中,使用的整常数有八进制,十六进制和十进制三种。
十进制整常数
十进制整常数没有前缀,其数码为 0 ~9。
例如237,-857,65535, 1787
八进制整常数
八进制整常数必须以0开头,即以0作为八进制数的前缀。数码取值为0-7.八进制数通常是无符号数。
例如:015(十进制为13),0101(十进制为65)
十六进制整常数
十六进制整常数的前缀为0x或者0X,其数码取值为0-9,A-F或a~f。
例如:OX2A(十进制为42), 0XA0(十进制为160), 0XFFFF(十进制为65535)
整型变量
在十六位字长的机器上,基本整型的长度也为16位,因此表示的数的范围也是有限定的,
十进制无符号整型常数的范围为0-65535,有符号数为-32768-+32767。
八进制无符号数的表示范围为0-0177777。
十六进制无符号数的表示范围为0X0~ 0XFFFF或 0x0~0xFFFF。。
整型变量的分类
(这里占多少个字节跟系统和编译器规定有关)
1.基本型: 类型说明符为 int ,在内存中占四个字节
2.短整型: 类型说明符为short int 或者short。所占字节和取值范围均与基本型相同。
3.长整型: 类型说明符为 long int 或者long,在内存中占四个字节。
4.无符号型: 类型说明符为 unsigned。
整型数据的储存
内存中以二进制存储(常识: 一个字节byte = 八位bit )
数值是以补码表示的:
正数的补码和原码相同;
负数的补码:将该数的绝对值的二进制形式按位取反再加1
例如:求- 10 的补码
10的原码 : 0000 1010
取反 : 1111 0101
再加1,得-10的补码: 11111 0110(第一位是符号位)
整型变量的定义:
变量定义的一般形式为:
类型说明符 变量名标识符 变量名标识符 ……;
例如:
int a,b,c; (a,b,c均为整型变量)
long x,y; (x,y 为长整型变量)
unsigned p,q ; (p,q 为无符号整型变量)
在书写变量定义时,要注意:
1.允许在一个类型说明符后,定义多个相同类型的变量,各变量名之间用“,”隔开,类型说明符和变量名之间至少用一个空格间隔。
2.最后一个变量名之后必须以 “;”结尾。
3.变量定义必须放在变量使用之前。一般放在函数体的开头部分。(注意区分全局变量)
实型数据(浮点型)
在C语言中,实数只采用十进制。它有两种形式:十进制小数形式,指数形式。
1.十进制数形式: 由数码0~9 和小数点组成。
例如:0.0 , 25.0 , 5.789 , 0.13 , 5.0 , 300. ,-264.89均为合法的实数,必须要有小数点
2.指数形式:由十进制数,加阶码标志, “e” 或 “E”以及 阶码(只能为整数,可以带符号)组成
一般形式为:
a E n (a 为十进制数, n为十进制整数)
如:2.1E5 (等于 2.1 *105) 3.7E-2(等于 3.7*10-2)
浮点型数据的存储方式及分类
实型数据一般占4个字节(32位)内存空间。按指数形式存储。
例如:
实数3.14159在内存中的存放形式如下
符号 小数部分 指数部分
+(-) 3.14159 1
小数部分占的位(bit)数愈多,数的有效数字愈多,精度愈高
指数部分占的位数愈多,则能表示的数值范围愈大
实型变量分类
实型变量分为: 单精度(float 型),双精度(double 型),和 长双精度(long double 型) 三类。
在Torbo C 中
单精度型占四个字节(32位)内存空间,其数值范围为 3.4E -38 ~ 3.4E +38只能提供七位有效数字。
双精度型占八个字节(64位)内存空间,其数值范围为 1.7E-3.8 ~1.7E +308,可提供16位有效数据。
实型数据的舍入误差
由于实型变量是由有限的存储单元组成的,因此能提供的有效数字总是有限的,
#include<stdio.h>
void main()
{
float a,b;
a = 123456.789e5;
b=a+20;
printf("%f\n",a);
printf("%f\n",b);
}
#include <stdio.h>
#include <stdio.h>
void main()
{
short int a,b;
a = 32767;
b = a+1;
printf("%d,%d\n",a,b);
}
字符型数据
字符常量
用单引号括起来的一个字符。例如 ‘a’ , ‘b’ , ‘=’ , ‘+’ 都是合法的字符常量
在C语言中,字符常量有以下特点:
1.字符常量只能用单引号括起来,不能用双引号或其他括号
2.字符常量只能是单个字符,不能是字符串
3.字符可以是字符集中任意字符,但数字被定义为字符型之后就不能参与数值运算。
如 ‘5’和 5 是不同的。‘5’ 是字符常量,不能参与运算。
字符变量
字符变量用来存储字符常量,即单个字符。
字符变量的类型说明符是char。字符变量类型定义的格式和书写规则都与整型变量相同。
例如:Char a ,b ;
转义字符
转义字符是一种特殊的字符常量。转移字符以反斜杠 “\”开头,后跟一个或几个字符。转义字符具有特定的含义,不同于字符原有的意义,故称为 “转义”字符。例如,在前面各例题printf 函数的格式中用到的 “\n” 就是一个转义字符,表示的是“回车换行”。转义字符主要用来表示那些用一般字符不便于表示的控制代码。
每个字符变量被分配一个字节的内存空间,因此只能存放一个字符。
字符值是以ASCII码的形式存放在变量的内存单元之中的。 如x的十进制ASCII码是 120, y的ASCII码是121。对字符变量a,b,赋予’x’和’y’值: a = ‘x’ ; b = 7 ;实际上是在a,b两个单元内存放 120 和55 的二进制代码。
字符串常量
是由一对双引号括起的字符序列,例如“CHINA”,”C program”
字符串常量和字符常量是不同的量。他们之间主要有以下区别:
1.字符常量由单引号括起来,字符串常量由双引号括起来。
2.字符常量只能是单个字符,字符串常量则可以含一个或多个字符。
3.可以把一个字符常量赋予一个字符变量,但不能把一个字符串常量赋予一个字符变量。
例如: 可以char a = ‘a’ 但是不能 char a = “a” ;
4.字符常量占一个字节的内存空间。字符串常量占的内存字节数等于字符串中字节数+1. 增加的一个字节中存放字符 “\0”(ASCII 码为0),这是字符串结束的标志。
例如"a"和’a’
a | \0 |
---|
\0是字符串结束标志
变量赋初值
类型说明符 变量1 = 值1,变量2 = 值 2, ······;例如:
int b ,c = 5;
float x = 3.2,y=3f,z = 0.75;
char chl = ‘K’, ch2 = ‘P’;
不同类型数据混合运算
变量的数据类型是可以转换的。转换的方法有两种,一种是自动转换,一种是强制转换。自动转换发生在不同的数据类型的量混合运算时,由编译系统自动完成。自动转换遵循以下规则。
1.若参与运算量的类型不同,则先转换成同一类型,然后进行运算。
2.转换按数据长度增加的方向进行,以保证精度不降低。如int 型和long 型运算时,先把int 量转成long 型后再进行运算。
3.所有的浮点型运算都是以双精度进行的,即使仅含有float单精度运算的表达式,也要先转换成double型,再作运算。
4.Char型和 short型参与运算时,必须先转换成int 型。
t b ,c
在赋值运算中,赋值号两边量的数据类型不同时,赋值号右边量的类型将转换为左边量的类型。
如果右边量的数据类型长度比左边长时,将丢失一部分数据,这样会降低精度,丢失的部分将四舍五入向前舍入。
类型自动转换的规则:
强制类型转换
强制类型转换是通过类型转换运算来实现的。
其一般形式为:
(类型说明符) (表达式)
其功能是把表达式的运算结果强制转换成类型说明符所表示的类型。
例如:
(float)a 把 a 强制转换为实型
(int )(x+y) 把x+y的结果转换为整型
在使用强制转换时应注意以下问题:
1.类型说明符和表达式都必须加括号(单个变量可以不加括号),如把(int )(x+y)写成 (int)x+y 则表示把x 转换成int 型之后再与 y 相加了。
2.无论是强制转换或是自动转换,都只是为了本次运算的需要而对变量的数据长度进行的临时性转换,而不改变数据说明时对该变量定义的类型。float x = 3.2,y=3f,z = 0.75;