C语言是什么?作为编程小白,可以选择入门的语言有很多,C语言;c++,Java,python等等,但是绝大多数过来人都会让你选择C语言,为何?
C语言诞生于1972年,甚至比我父母的年龄还大,可以说是其他编程语言的老大哥,虽然在C语言之上还有B语言,但是由于B语言的缺陷,C语言变成了最早的比较成熟的编程语言。为何推荐C语言,简单高效啊!C语言虽然没有python这种后起之秀简单,但是由于C语言更加偏向底层系统,但是在执行效率上不知道比其他语言快到哪里去了 +1s
C语言是一门面向过程的、抽象化的通用程序设计语言,广泛应用于底层开发。C语言能以简易的方式编译、处理低级存储器。C语言是仅产生少量的机器语言以及不需要任何运行环境支持便能运行的高效率程序设计语言。当前阶段,在编程领域中,C语言的运用非常之多,它兼顾了高级语言和汇编语言的优点,相较于其它编程语言具有较大优势。
综上所述,C语言是很推荐各位作为编程入门的一门语言,精通C语言后学习其他语言也是得心应手,而说到编程入门,就不得不提到程序员学会的第一句话
“hello world!”
#include
int main()
{
printf("hello world\n");
return 0;
}
如上图代码所示,这就是大名鼎鼎的hello world,是每个新手在学习编程时所遇到的第一个代码,刚开始看不懂?不要紧,接下来就会详细介绍这个代码的实现细节
char //字符数据类型
short //短整型
int //整形
long //长整型
long long //更长的整形
float //单精度浮点数
double //双精度浮点数
这个就是C语言中所用到的数据类型,用来储存各种各样的数据,比如整数用int存,小数用float 与double存,字符用char存,各种数据都有其对应的数据类型,而每个数据类型在计算机中所占空间大小也是不同的,如何知道这些空间大小呢?
#include
int main()
{
printf("%d\n", sizeof(char));
printf("%d\n", sizeof(short));
printf("%d\n", sizeof(int));
printf("%d\n", sizeof(long));
printf("%d\n", sizeof(long long));
printf("%d\n", sizeof(float));
printf("%d\n", sizeof(double));
printf("%d\n", sizeof(long double));
return 0;
}
char ch = 'w'; int weight = 120; int salary = 20000;
在C语言中,给出了一个非常好用的函数,sizeof(),用这个可以很清楚的知道各个数据所占的空间,至于具体是多少,就请各位读者放到自己的程序中试试吧。
了解了数据类型后,该学习怎么使用它了。如何在C语言中描述一个具体的事物呢,描述一个人要用年龄,体重,性别和姓名等等信息,这些东西在C语言中也可以表示出来,这里就可以引入变量与常量的概念了
int age = 50;
float weight = 60f;
char name = 'john';
局部变量 (在函数里面定义的变量叫做局部变量)
全局变量(在main函数之前定义的变量就叫做全局变量啦)
#include
int global = 2019;//全局变量
int main()
{ int local = 2018;//局部变量
//下面定义的global会不会有问题?
int global = 2020;//局部变量
printf("global = %d\n", global); //输出的还是2020
return 0;
}
总结:
上面的局部变量global变量的定义其实没有什么问题的!
当局部变量和全局变量同名的时候,局部变量优先使用。
可以随着程序运行而改变的量叫变量,那么在程序运行中不变的量叫什么呢?常量。
在C语言中常量可以用以下几种方法定义
1.字面常量
2.const修饰的常变量
3.#define定义的标识符常量
4.枚举常量
#include
#define MAX 30 //#define修饰的标识符常量
enum MAN
{
NAME,
HIGHT,
WEIGHT,
SEX;
};
//括号中即为枚举常量
int main()
{
188; //字面常量
const int num = 199; //const修饰的常变量
return 0;
}
在之前的hello world程序里,我们写了一个
printf("hello world\n");
其中显示在屏幕上的就是hello world,
那么在printf括号里面的
"hello world\n"
这又是什么东西?
这种由双引号(Double Quote)引起来的一串字符称为字符串字面值(String Literal),或者简称字符串。
注:字符串的结束标志是一个 \0 的转义字符。在计算字符串长度的时候 \0 是结束标志,不算作字符串内容
那么、\n 又是什么?
实际上,在之前的hello world中,你可以把输出内容改为h\ne\nl\nl\no\n,这样你就会得到竖起来的
h
e
l
l
o
为何呢?这是因为\n在C语言中会被程序读作另一种操作,这种称为转义字符
这里我为读者总结了一些转义字符如下
\" //表示字符串内部的一个双引号
\\ //用于表示一个反斜杠,防止其它被解释为转义序列符
\a //警告字符
\b //退格符
\t //水平制表符
\f //进纸符
\n //换行符
\v //垂直制表符
\r //回车
\ddd //ddd表示1~3个八进制的数字。 如: \130 X
\xddd //ddd表示3个十六进制数字。 如: \x030
在前面的代码片段中,我们会发现这种东西 // 跟在它后面的东西好像都变成了灰色,这是因为 在程序运行中,//后面的东西会自动被计算机忽略掉,利用这个属性,我们可以在程序中随心所欲的写自己想写的东西,不过一般//都会被程序员拿来解释代码和注释掉不需要的代码,除了//还有
/* */这种注释方法,可以直接多行注释,就有许多程序员拿来做很多有意思的事情了。
如果你好好学习,将来就能找到高薪工作,如果没有,就会变成失败者,这种语言如何在C语言中表达呢,这就要引入选择语句if else
#include
int main()
{
if(好好学习)
{
printf("学习,高薪,白富美!\n");
}
else{
printf(" you wii be a loser\n");
}
return 0;
}
敲代码是个日复一日的行为,只有你的代码量积累到一定程度你才能成功,这种需要重复很多次的行为再C语言中有什么方法实现呢,循环为我们提供了解决方案
//while循环的实例
#include
int main()
{
printf("好好学习!\n");
int line = 0;
while(line<=20000)
{
line++;
printf("敲代码啊敲代码\n");
}
if(line>20000)
printf("成为大佬!!\n");
return 0;
}
以上就是while循环,当你没有达成某一目标时,你要坚持不懈的做很多工作才能达到目标。此外循环还有do while循环与for循环,这些东西都会在以后学到,原理都是相似的。
在数学中有个函数f(x)的概念,我们如何在C语言中实现呢
#include
int f(int a)
{
return a*a;
}
int main()
{
int x,
int x_square = f(x);
printf("x的平方 = %d\n", x_square);
return 0;
}
这里我们将函数表达式设置成了x平方,实际上在C语言中的函数不仅可以实现数学中的函数概念,也可以实现其他更为复杂的功能。而一个函数可以重复利用 ,函数的特点就是简化代码,代码复用。
之前介绍了一些数据类型,那么问题来了,存入一个整数,是很容易的,那么我要是存多个整数,甚至是1到100,那么该如何存入呢?这里就引出了数组的概念
数组即为一组相同类型元素的集合
值得注意的是数组元素是从下标为0的地方开始存储的。
int arr[10] = {1,2,3,4,5,6,7,8,9,10}; //数组的定义
其使用方法
#include
int main()
{
int arr[10]={1,2,3,4,5,6,7,8,9,10};
int n=0;
while(n!=10){
printf("%d\n",arr[n]);
n++;
}
return 0;
}
1
2
3
4
5
6
7
8
9
10
则会输出1到10这十个数字。
算术操作符,移位操作符,位操作符,赋值操作符,单目操作符,关系操作符,逻辑操作符,条件操作符,逗号表达式,下表引用、函数调用和结构成员
算术操作符:
+//加
-//减
* //乘
/ //除
%//(取余)
移位操作符:
<< //(左移操作符)
>> //(右移操作符)
位操作符
& //按(二进制)位与 二进制的对应位上,有0出0,全1出1
| //按(二进制)位或 二进制的对应位上,有1出1,全0出0
^ //按(二进制)位异或 二进制的对应位上,相异为1,相同为0
赋值操作符:
=、+=、-=、/=、%=、>>=、<<=、&=、|=、^=。
单目操作符:
! //逻辑反 操作
- //负值
+ //正值
& // 取地址
sizeof// 操作数的类型长度(以字节为单位)
~ //对一个二进制按位取反
–- //前置、后置–-
++ //前置、后置++
(类型) //强制类型转换
逻辑操作符:
&& //逻辑与
|| //逻辑或
条件操作符:
exp1 ? exp2 ; exp3 //相当于 if else语句
关系操作符
>
>=
<
<=
!= //用于测试“不相等”
== //用于测试“相等”
常见的关键字有:
auto //声明自动变量
short //声明短整型变量或函数
int //声明整型变量或函数
long //声明长整型变量或函数
float //声明浮点型变量或函数
double //声明双精度变量或函数
char //声明字符型变量或函数
struct //声明结构体变量或函数
union //声明共用数据类型
enum //声明枚举类型
typedef //用以给数据类型取别名
const //声明只读变量
unsigned//声明无符号类型变量或函数
signed //声明有符号类型变量或函数
extern //声明变量是在其他文件正声明
register//声明寄存器变量
static //声明静态变量
volatile//说明变量在程序执行中可被隐含地改变
void //声明函数无返回值或无参数,声明无类型指针
if //条件语句
else //条件语句否定分支(与 if 连用)
switch //用于开关语句
case //开关语句分支
for //一种循环语句
do //循环语句的循环体
while //循环语句的循环条件
goto //无条件跳转语句
continue//结束当前循环,开始下一轮循环
break //跳出当前循环
default //开关语句中的“其他”分支
sizeof //计算数据类型长度
return //子程序返回语句(可以带参数,也可不带参数)循环条件
在C语言中,#define是个非常神奇的存在,它不仅可以定义常量,它还可以定义函数,甚至可以定义关键字
//define定义标识符常量
#define MAX 1000
//define定义宏
#define ADD(x, y) ((x)+(y))
#include
int main()
{
int sum = ADD(2, 3);
printf("sum = %d\n", sum);
sum = 10*ADD(2, 3);
printf("sum = %d\n", sum);
return 0;
}
要说C语言中有什么难点,那毫无疑问就是指针了,要了解指针,就要了解和计算机底层相关的知识
众所周知,内存是电脑上特别重要的存储器,计算机中所有程序的运行都是在内存中进行的 。 所以为了有效的使用内存,就把内存划分成一个个小的内存单元,每个内存单元的大小是1个字节。
为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地址。
而指针,就是用来存放地址的一种变量,用来存储其他变量的地址,从而使得程序可以通过地址直接访问变量
#include
int main()
{
int num = 10;
int *p; //定义指针变量p
p=# //使p指向num的地址,为了访问其中的值
printf("%d\n",*p); //通过访问地址输出num的值
printf("%p\n",&p); //访问p在电脑中指向的存储地址
return 0;
}
为了知道每个类型的指针大小是否一样则有如下代码
#include
int main()
{
printf("%d\n",sizeof(char *));
printf("%d\n",sizeof(int *));
printf("%d\n",sizeof(double *));
printf("%d\n",sizeof(float *));
printf("%d\n",sizeof(short *));
return 0;
}
虽然上面都显示了一样的数字,但是指针的大小却与使用的平台有关,指针在32位平台中大小位4字节,在64位平台中大小为8字节。
在描述一个物体时,我们需要描述它的大小,外观,重量,描述一个人也需要年龄,性别,名字,身高,体重之类的信息,在C语言中,就有一个可以描述出来这些信息的东西,结构体
#include
struct People //定义结构体
{
char name[10];
int age;
int weight;
float hight;
char sex;
};
int main()
{
struct People a={"john",20,100,1.87,"men"}; //初始化该结构体
printf("姓名:%s 年龄:%d 体重:%d 身高:%f\n",a.name,a.age,a.weight,a.hight,a.sex);
return 0;
}
当然也可以通过访问其地址来输出结构体变量中的值,使用->或者(*p)来访问
#include
struct People //定义结构体
{
char name[10];
int age;
int weight;
float hight;
char sex;
};
int main()
{
struct People a={"john",20,100,1.87,"men"}; //初始化该结构体
printf("姓名:%s 年龄:%d 体重:%d身高:%f\n",a.name,a.age,a.weight,a.hight,a.sex);
struct People *p = &a; //定义结构体指针p指向a的地址
printf("姓名:%s 年龄:%d 体重:%d 身高:%f\n",a->name,a->age,a->weight,a->hight,a->sex);
//通过指针p来访问结构体中变量的值,用到操作符->
return 0;
}a