走进C语言世界-初始篇
注:此篇为基础C的简单概述,详细讲解将在后续发表,此篇可作为复习概述。
- C语言是什么
- 数据类型
- 变量、常量
- 字符串+转义字符+注释
- 选择语句
- 循环语句
- 函数
- 数组
- 操作符
- 常见关键字
- define用法和宏
- 指针
- 结构体
1.C语言是什么
简单来说C语言是一门计算机语言,正如我们人与人之间是通过语言来交流的,有汉语,英语各种各样的语言,同样的人与机器之间也可以通过各种语言来交流,从最开始的低级语言到如今的高级语言,二进制语言–汇编语言–B语言–C语言/C++/JAVE,还有各种标准和编译器。
我们先来看一个简单的C程序
#include<stdio.h> //程序运用输入输出(scanf/printf),需要引用头文件,就像我们生活中借东西需要提前打个招呼一样
int main() //主函数
{
printf("Hello World\n");
return 0;
}
//注:一个函数有且仅有一个main函数,程序从main函数开始,从main函数结束。
2.数据类型
所有语言/科技发展都是源于生活的,设计,创造出来为了解决/描述生活中问题。生活中有各种各样数据类型,如:人的名字用字符串,年龄用整数描述,考试分数用小数等等,生活中描述事物都有着不同类型,C语言为了描述他们设计不同数据类型。
char //字符数据类型
short //短整型
int //整形
long //长整型
long long //更长的整形
float //单精度浮点数
double //双精度浮点数
注:不同编译器类型所占字节大小不同,为什么?
->计算机内存空间有限的,描述不同事物所需占用空间大小不同,为节省内存空间,需合理使用数据类型
//不用的数据类型所占用的字节大小不一样,用sizeof函数计算,不同编译器计算大小可能不同。
如:
#include<stdio.h>
int main()
{
printf("%d\n", sizeof(long));
return 0;
} //这样我们就可以算出长整型大小
3.变量、常量
3.1变量
生活中有不变的量如:血型,也有变的量如:身高-C语言中描述一些会变的量叫变量,如:int age=18;
//变量又分为全局变量和局部变量,而如果全局变量和局部变量同时存在时,局部变量优先。
#include <stdio.h>
int global = 2021;//全局变量,定义在程序的最上面
int main()
{
int local = 2022;//局部变量
printf("global = %d\n", global);
return 0;
}
//屏幕打印global = 2022
作用域和生命周期
- 作用域
局部变量的作用域是变量所在的局部范围。 全局变量的作用域是整个工程。- 生命周期
局部变量的生命周期是:进入作用域生命周期开始,出作用域生命周期结束,全局变量的生命周期是:整个程序的生命周期。
3.2常量
常量是固定值,在程序执行期间不会改变。这些固定的值,又叫做字面量常量:整数常量、浮点常量、字符常量,或字符串字面值,也有枚举常量。
#include <stdio.h>
//举例
enum Sex
{
MALE,
FEMALE,
SECRET
}; //括号中的MALE,FEMALE,SECRET是枚举常量
int main()
{
//字面常量演示
3.14;//字面常量,浮点常量
1000;//字面常量,整型常量
//const 修饰的常变量
const float pai = 3.14f; //这里的pai是const修饰的常变量,但本质上还是变量
//如果这样写会报错:pai = 5.14;//因为const修饰的变量是不能直接修改的!
//#define的标识符常量 演示
#define MAX 100
printf("max = %d\n", MAX);
//枚举常量演示
printf("%d\n", MALE);
printf("%d\n", FEMALE);
printf("%d\n", SECRET);
//注:枚举常量的默认是从0开始,依次向下递增1的。
return 0;
}
最终结果:
4.字符串+转义字符+注释
4.1字符串
这种由双引号引起来的一串字符称为字符串,由单引号引起的字符。注:字符串的结束标志是一个 \0 的转义字符,在计算字符串长度的时候 \0 是结束标志,不算作字符串内容。
#include<stdio.h>
int main()
{
char arr1[]="abc"; //以字符串赋值在最后会自动加'\0'
char arr2[]={'a','b','c'}//而以单个字符赋值需要自己加上'\0',这里没有加,打印结果会错误,一直打印,直到遇到\0停止。
printf("%s",arr1);
printf("%s",arr2); //因为给arr2赋值时未加'\0',打印结果与arr1不一样(直到随机打印'\0'时arr2结束)
return 0;
}
4.2转义字符
转义字符顾名思义就是转变意思。
如下打印字符个数应该为多少(有坑)
#include <stdio.h>
int main()
{
printf("%d\n", strlen("abcdef"));
// \62被解析成一个转义字符
printf("%d\n", strlen("c:\test\628\test.c"));
return 0; //这里\628为2个字符,\000对应八进制只有0-7没有8.
}
4.3注释
- C语言风格的注释 /xxxxxx/型
缺陷:不能嵌套注释- C++风格的注释 //xxxxxxxx
可以注释一行也可以注释多行
5.选择语句
选择语句也叫判断语句,判断为真(非0的数),执行这条语句,为假(0),则不执行。
选择语句有:if语句,if…else,嵌套if…else,switch语句…
#include<stdio.h>
int main()
{
int code=0;
printf("你未来会坚持写练习敲代码吗?(1or0)");
scanf("%d",&code);
if(code)
printf("加油,拿40万offer就要付出40万努力!");
else
printf("小伙子,搬砖去吧!");
return 0;
}
为什么其他选择语句怎么没讲?,我不是水,此次是初始C语言,点到为止,后续会详细讲解。
6.循环语句
顾名思义,循环语句就是一直循环,知道遇到结束标志才会终止,循环语句有:while循环,for循环,do…while循环,循环结束标志有:break语句,continue语句,goto语句。
#include<stdio.h>
int main()
{
int line=0;//现在的你
for(line=0;line<50000;line++)
{
printf("废物,你要继续敲代码\n");
}
printf("厉害,大厂在向你招手");
return 0;
}
7.函数
函数有很多,最简单的main函数,还有自定义函数…
#include<stdio.h>
int ADD(int x,int y)//定义自定义函数,形参
{
int z = x+y;
return z;//函数返回值返回给sum
}
int main()
{
int a,b,sum;
int a=5;
int b=7;
sum=ADD(int a,int b);//调用自定义函数,实参,实参传递给形参
return 0;
}
8.数组
数组是一群数字集合,如:
int arr[10]={0,1,2,3,4,5,6,7,8,9}//定义了1个整型数组,最多存放10个元素。
C语言规定:数组的每个元素都有一个下标,下标是从0开始的,数组可以通过下标来访问的。
如:int arr[10]={0};//10个元素都是0,下表0-9
数组简单的使用:
#include<stdio.h>
int main()
{
int i=0,arr[10]={0,1,2,3,4,5,6,7,8,9}
for(i=0;i<10;i++)
{
printf("%d\n",arr[i]);
}
return 0;
}
9.操作符
算数操作符:+ - * / % //取整(/),取余(%)
移位操作符:<< >> //二进制位向左/右移动
位操作符:& ^ | //按位与,或,非(二进制)
赋值操作符:= += -= *= /= &= ^= |= >>= <<=
单目操作符:
! 逻辑反操作
- 负值
+ 正值
& 取地址
sizeof 操作数的类型长度(以字节为单位)
~ 对一个数的二进制按位取反
-- 前置、后置--
++ 前置、后置++ //++i,先给i加1后在使用,整个表达式值为i加1后值,而i++是先把i使用后在加1,整个表达式值为i原来的值,但是i的值为i加1后值
* 间接访问操作符(解引用操作符)
(类型) 强制类型转换
关系操作符:
> >= < <=
!= 用于测试“不相等”
== 用于测试“相等”
逻辑操作符:
&& 逻辑与
|| 逻辑或
条件操作符:exp1 ? exp2 : exp3
逗号表达式:exp1, exp2, exp3, …expN(从左往右,最后结果是计算后最右边表达式)
下标引用、函数调用结构成员:[] () . ->(结构体/指针引用成员)
9.1运算符的优先级和结合性
超链接地址:超全运算符优先级和结合性
好多不好记,我来总结下:
[] () . ->下标引用这一类 >单目运算符(就是对一个量作用的,如++)>双目运算符(同理,作用两个量,表达式左右两边都有值)>三目运算符(?:就这一个三目运算符)>赋值运算符(=,+=)>逗号运算符
10.常见关键字
auto break case char const continue default do double else enum
extern float for goto if int long register return short signed
sizeof static struct switch typedef union unsigned void volatile while
//简单介绍几个
10.1typedef关键字
typedef关键字是类型重命名,如:
typedef int = ont; //这时int 和 ont定义效果一样
int i=10;
ont i=9; //最后i=9
10.2stastic关键字
1.static修饰局部变量
#include<stdio.h>
void text()
{
static int i=0; //如果没有static,打印结果是10个1.
i++
printf("%d",i);
}
int main()
{
int i=0;
for(i=0;i<10;i++)
{
text();
}
return 0;
}
//static修饰局部变量改变了变量的生命周期(生命周期为整个程序),让静态局部变量出了作用域依然存在,到程序结束,生命周期才结束。
2.static修饰全局变量
//add.c
static int g_val = 2018;
//test.c
int main()
{
printf("%d\n", g_val);
return 0;
}
//会报错,全局变量是具有外部属性的,如果全局变量被static修饰,外部链接属性就变成了内部链接属性,其他源文件就无法通过这个链接属性找到这个符号
//static修饰的变量只能在自己的.c文件中使用
3.修饰函数同理
11.#define用法和宏
define有种用法,一种是定义标识符常量,一种是宏定义,注意宏定义的格式,是整体代换,使用时要不要加()。
1.第一种
#define PI 3
2.第二种
#include<stdio.h>
#define ADD(x,y) ((x)+(y)) //注意:是整体替换,整体替换后在求结果
int main()
{
int sum=ADD(2,3);
printf("sum=%d",sum);
sum=10*ADD(2,3);
printf("sum=%d",sum);
return 0;
}
12.指针
每一个变量都有一个内存位置,每一个内存位置都定义了可使用 & 运算符访问的地址.内存是由一个个内存片段组成的,而每一个片段大小为1个字节,而变量是创建内存中的(在内存中分配空间的),每个内存单元都有地址,因此变量是有地址的。
// 取地址取的是变量所在空间的首个地址
#include<stdio.h>
int main()
{
int num;
# //取出num的地址
printf("%p",&num); //注:这里num的4个字节,每个字节都有地址,取出的是第一个字节的地址(较小的地址)
return 0;//%p是地址的形式打印
}
地址的存储,需要定义指针变量。
int i=10;
int *p=&i;
*p=20; //这时候i=20
指针使用实例:
#include<stdio.h>
int main()
{
char ch='a'
char *p=&ch;
*p='b';
printf("%c",*p); //或者写成printf("%c",ch);
return 0;
}
//指针变量的大小取决于地址的大小
//32位平台下地址是32个bit位(即4个字节)
//64位平台下地址是64个bit位(即8个字节)
13.结构体
我们生活中对一些实物描述可以放到一起,如一个学生的学号,成绩,年龄。
例如:
struct stu
{
int id;
float grade;
int age;
}; //注意结构体格式在}后加;
结构体初始化:
struct stu s={ 13555, 97.5, 18};
printf("id=%d,grade=%f,age=%d\n", s.id, s.grade, s.age);
struct stu * p = &s;
printf("id=%d,grade=%f,age=%d\n", p->id, p->grade, p->age);
- 初始C语言到这里差不多结束了,这篇知识基础概要,后续将对每一节进行详细讲解总结。