C语言编程基础
1.C语言功能:类似英语,英语是实现人和人交流沟通的工具
C语言实现人和计算机交流沟通的工具
除了C语言,还有C++,JAVA,Python,Go,Rust等
2.C语言背景简介(了解)
1972年由丹尼斯里奇发明C语言
1978年出版《the c programming language》,预示着C语言正式走向世界
1989年发布C89标准(类似普通话)
1999年发布C99标准(扩展功能)
3.编写人生第一个标准C程序
具体实现步骤:
mkdir -p /home/tarena/stdc/day02
cd /home/tarena/stdc/day02
vim helloworld.c 添加如下内容
/*
这是我的第一个C语言程序
我很激动
*/
//这个仅仅作为一个测试
#include <stdio.h>
int main(void){
printf("你好,世界.");
printf("hello,world.\n");
return 0;
}
保存退出
继续执行以下命令:
gcc helloworld.c 作用:编译程序
ls -lh 此时多了一个a.out文件
./a.out 作用:运行a.out程序
4.总结:C程序基本编程规范
a)C程序对应的文件有两种:
源文件:以.c结尾,例如:helloworld.cd
头文件:以.h结尾,例如:stdio.hello
任何C程序必须有一个源文件,头文件可以有,可以没有
b)C程序注释(就是程序diamante的解释说,给程序员看,不参与程序的编译和运行)
1./*中间就是要解释说明的注释内容*/
优点:可以注释多行
缺点:不能嵌套注释,例如:/*我是大神 /*我是小神*/ */ (错误语法)
2.//注释内容
有点:可以嵌套注释,例如://////我是大神
缺点:不能多行注释
c)C程序要包含一个别人写好的头文件(就是将头文件的内容全部拷贝过来),格式有两种,
1.语法:#include <头文件名>
例如:#include <stdio.h>
语义:告诉gcc编译器将来默认到linux系统的/usr/include目录下找stdio.h开头的文件
找到之后将这个头文件的内容全部拷贝过来
2.语法:#include "头文件名"
例如:#include "stdio.h"
语义:告诉gcc编译器现在当前目录下找stdio.h头文件,如果找到了,那就包含拷贝
如果没有找到,再去/usr/include目录下找头文件stdio.h,如果找到那就包含拷贝
如果还没找到,报错
d)C程序必须要包含一个唯一的主函数,名称必须交main
并且main函数的原型(),必须如下:
int main(void){
//代码内容
}
或者:
int main(void)
{
//代码内容
}
结论:将来运行C程序时,linux操作系统之人main函数,必须从main函数开始从上往下挨个执行
e)C程序的主函数main中(括号里面的内容)编写规范:
1.每条语句后面必须跟分好";"
2.执行顺序:从上往下挨个执行
3.只要遇到或者执行return这个关键字,C程序立马结束
return后面可以跟一个数字,例如:
return 0; 表示告诉操作系统,此程序执行结束了并且执行的很正常
return -1; 表示告诉操作系统,此程序执行结束了但是执行的时候有点问题
例如:main函数的形式如下
int main(void){
printf("你好,世界.");
printf("hello,world\n");
return 0;
}
f)人生认识的第一个标准C库函数printf(就是大神写好的函数,我们直接拿来用即可)
1.标准C库函数使用,调用语法:函数名(信息);
2.printf函数的功能:向显示器打印输出信息
3.调用格式:printf("要输出打印的信息\n");
注意:'\n':表示回车换行,就是打印完信息之后将光标换到下一行
如果没有'\n',光标继续停留在本行
例如:
printf("abc");
printf("efg\n");
效果:abcdefg
printf("abc\n");
printf("efg\n");
效果:
abc
efg
4.注意:要想调用大神的printf函数,必须开头包含头文件stdio.
5.printf利用占位符可以打印输出指定的数字信息
%d占位符功能:按照整数形式打印输出一个数字
例如:printf("1 + 1 = %d\n",2); 语义:将来数字2会放到%d这个位置,然后将1+1=2这个信息输出到显示器上
printf("1 + 1 = %d\n",1+1); 语义:先算1+1=2,然后把计算的结果放在%d这个位置最后打印1+1=2
5.大名鼎鼎的gcc编译器(作者:GNU软件之父理查德斯托曼)
a)gcc编译器功能:类似翻译官,将C程序源文件和头文件翻译生成计算机能够识别的可执行文件
类比:中文版三国(源文件)----->翻译官(gcc编译器)------>英文版三国(计算机识别的可执行文件)
b)gcc编译源文件流程三步骤:
1.预处理:就是将源文件中要包含的头文件,例如:stdio.h全部拷贝过来
此过程简称预处理
对应的gcc命令选项:-E
预处理的命令:gcc -E -o 预处理文件.i 源文件.c
注意:-o 后面只跟要生成的新文件
语义:对源文件进行预处理生成预处理文件.i
2.只编译不链接:就是将预处理文件进行单独翻译生成计算机能够识别的可执行文件
但此时生成的文件不包含大神的代码,例如:printf
所以此程序此时还不能运行
对应的gcc命令选项:-c
对应的gcc命令格式:gcc -c -o 可执行文件.o 预处理文件.i
3.链接:就是讲大神的各种代码,例如printf和自己的程序合并起来,合并的专业术语叫链接
最终生成计算机能够执行的一个完整程序
对应的命令:gcc -o 可执行文件 可执行文件.o
最终生成可执行文件
c)务必掌握gcc编译源文件的三种方式:
1.流氓发:gcc helloworld.c 默认都会生成a.out(这个名字做不到见名知意)
2.分步编译:
gcc -E -o helloworld.i helloworld.c //先预处理
gcc -c -o helloworld.o helloworld.i //然后只编译不链接
gcc -o helloworld helloworld.o //最后链接大神的printf代码,最终生成helloworld可执行程序
./helloworld //运行程序
3.一步到位
gcc -o helloworld helloworld.c //直接对源文件进行翻译生成可执行文件
心里要明白:gcc还要做三件事,只是看不到而已
./helloworld
案例:利用以上三种方法,对刚才的helloworld.c进行编译运行
------------------------------------------------------------------------------------------------------------------
第三课:C语言(C程序)的变量
1.务必掌握计算机内存相关的概念
内存特点:暂存CPU运算之前的数据和运算之后的数据,还有暂存程序,任何程序都是在内存中存储,
所以势必要消耗内存,速度快,掉电数据丢失
结论:任何程序最终都是玩内存
字节(Byte):计算机将内存分成一格一格,每一格用来存储一格数字,每一格的专业术语叫字节
注意Byte的简称:B
换算公式:1KB = 1024B
1MB = 1024 * 1024KB
1GB = 1024MB = 1024 * 1024KB = 1024 * 1024 * 1024B
地址(Address):计算机给内存的每个字节指定一格固定的唯一的编号,此编号从0开始,后续地址加1即可
此编号的专业术语叫地址
切记:不管在哪里,只要知道了内存的某个字节的地址,将来就可以通过地址对内存进行访问(读或者写)
类似:不管快递小哥在哪里,快递小哥知道你的地址,就可以给你送快递
存储区(Buffer):计算机将1个字节或者多个连续的字节形成一个存储单元用来存储数字
例如:300亿这个数字如果用1个字节来存储显然这个数字太大了,1字节内存存不下
可以用4字节的连续内存来存储这个数字
首地址(base address):存储区中第一个字节的地址又称首地址
Q:C程序如何分配内存空间来存储数字呢?
A:切记,任何程序要想访问内存,必须先分配获取到内存才能访问
如果没有分配获取到内存,直接去访问:操作系统直接将程序干掉,杀死
C程序通过定义变量来实现分配的内存!
2.变量功能:就是给C程序分配内存空间,一旦分配内存臭狗,程序就可以对内存进行存储数字还可以修改存储的数字
3.定义变量(又称分配内存)语法格式:
数据类型 变量名 = 初始值(可以有,可以没有);
例如:int a = 250;
说明:'int' 它是一个关键字,它对应一种数据类型,表示将来可以分配4字节的内存空间
'a' 变量名
'250' 就是给分配的内存放了一个数字250
结论:这条语句的结果是分配了4字节内存空间并且这块内存空间放了一个数字250
例如:修改变量的值(也就是修改内存存储的数字)
int a = 250;
a = 520; //修改变量a的值为520,也就是将内存中原先的数字250修改为520,其中"="就是重新赋值的意思
打印变量的值(打印内存中存储的数据值):printf("%d\n",a); //将变量a的值打印输出
4.定义变量的四种形式:
a)只定义(只分配内存)不初始化(不赋初始值)
int a; //此时变量a的值或者对应的内存存储的数字是一个随机乱七八糟的数字
b)定义并且初始化
int a = 250;
c)连续只定义不初始化多个变量(逗号分隔)
int a,b,c; //同样变量的值是乱七八糟的随机数
d)连续定义并且初始化多个变量
int a = 100, b = 200, c = 300;
小案例:演练变量的使用
实验步骤如下:
cd /home/tarena/stdc/day02
vim var.c
gcc -o var var.c //也可以分步编译
./var
5.标识符命名规则
a)标识符:就是变量名(例如:a,b,c,d等)或者函数名(例如:main,printf等)
b)标识符命名规则:
1.首字符不能是数字,只能是字母或者下划线,区分大小写
例如:int 2var; //gcc报错
int v2ar; //可以
int _2var; //可以
2.尽量做到见名知意
int a = 18; //你能知道a代表年龄的意思吗?
int age = 18; //age就是年龄的意思
int weight = 200; //体重
int height = 200; //身高
3.驼峰(windows程序员)和下划线(linux程序员)
驼峰:int nAge = 19;
int GreateWindows = 250;
下划线:int Greate_windows = 250;
4.C语言的关键字不能使用
例如:int,return,main,void等不能用
例如:int int = 250; //gcc报错
int void = 250; //gcc报错
6.C语言的基本编程风格:(不强求,其他风格都要根据公司来定)
a)各种该
该有空格的加空格
该对齐的对齐
该独占一行的独占一行
该有TAB键的就添加TAB键
例如:
int main(void){printf("hello,world\n");return 0;} //理论上可以,实际阅读起来要命!
应该:
int main(void){
//独占一行
//对齐
printf("abc\n");
printf("efg\n");
//独占一行
}
b)代码尽量写在屏幕左侧的2/3区域,右侧1/3建议留白,如果超过换行