本系列均是帮助初学者了解c语言有哪些语法,后续将详细介绍具体细节.
1.选择语句
接下来我们介绍选择语句,不是很难理解,这里笔者就简单给一份代码.
#include <stdio.h> int main() { int coding = 0; printf("你会去坚持敲代码吗?(选择1 or 0):>"); scanf("%d", &coding); if(coding == 1) { prinf("坚持,你会有好offer\n"); } else { printf("放弃,回家卖红薯\n"); } return 0; }
当然,你也可以有更多选择 ,在if 和 else之间加上else if(condition),就像早餐不是除了包子就是汉堡一样,人生也可以有很多选择.
2.循环语句
人生中有很多事情都是我们每天一直循环的在做的,比如吃饭睡觉,现在我们介绍c语言中的循环语句
//while循环的实例 #include <stdio.h> int main() { printf("加入比特\n"); int line = 0; while(line<=20000) { line++; printf("我要继续努力敲代码\n"); } if(line>20000) printf("好offer\n"); return 0; }
上述介绍的就是循环语句中的一种,while循环,当循环判断条件为真的时候,循环中的语句就会一直执行,为假则跳出循环.
3.函数
为了更好的实现代码的重复使用,我们通常会将一系列代码封装成一个函数实现复用,节省了代码量,也使得代码书写的更加灵活,实现"高内聚,低耦合"的代码风格. 下面我们以加法函数为例展示.
#include <stdio.h> int main() { int num1 = 0; int num2 = 0; int sum = 0; printf("输入两个操作数:>"); scanf("%d %d", &num1, &num2); sum = num1 + num2; printf("sum = %d\n", sum); return 0; } 上述代码,写成函数如下: #include <stdio.h> int Add(int x, int y) { int z = x+y; return z; } int main() { int num1 = 0; int num2 = 0; int sum = 0; printf("输入两个操作数:>"); scanf("%d %d", &num1, &num2); sum = Add(num1, num2); printf("sum = %d\n", sum); return 0; }
你是不是发现了我们的函数在一个功能重复使用时使得代码更简练明朗.
4.数组
接下来我们来介绍数组,大家可以用高中学习的集合来理解,数组就是一种元素的集合,比如整形数组,字符数组等等. 比如说我们存储十个数字就不用一个一个创建变量存储了,就用一个数组存储就可以了.
4.1 数组的声明
int arr[10] = {1,2,3,4,5,6,7,8,9,10};//定义一个整形数组,最多放10个元素
4.2 数组的下标
在C语言中,数组的下标一般是从0开始的,比如数组有十个元素,那么它的下标依次就是0-9.我们就可以通过数组的下标来访问数组中的元素,比如说arr[0] = 100,我们就将数组中第一个元素修改成了100.
4.3 数组的使用
我们不妨向数组写入元素再打印出来看看.
#include <stdio.h> int main() { //输出数组元素 int i = 0; int arr[10] = {1,2,3,4,5,6,7,8,9,10}; for(i=0; i<10; i++) { printf("%d ", arr[i]); } printf("\n"); return 0; }
5.操作符
这里我将罗列c语言中的操作符,具体使用暂时不提.(混个眼熟)
关系操作符
>
>=
<
<=
!= 用于测试“不相等”
== 用于测试“相等”
逻辑操作符
&& || |
逻辑与 逻辑或 |
条件操作符
exp1 ? exp2 : exp3
下标引用、函数调用和结构成员
[] () . ->
6.常见关键字
可能这里的关键字很多你都不认识,现在我们就来介绍几个非常常见的关键字.
6.1 typedef关键字
顾名思义,就是类型定义的意思.可以自己定义将一些长的类型名定义成简单易用的类型名
//我觉得unsigned int写起来太长了,我自己定义成u_int typedef unsigned int u_int; int main() { //观察num1和num2,这两个变量的类型是一样的 unsigned int num1 = 0; u_int num2 = 0; return 0; }
6.2 static关键字
static 解释为静态的,在C语言中可以用来修饰局部变量,全局变量和函数.
6.2.1 static修饰局部变量
//代码1 #include <stdio.h> void test() { int i = 0; i++; printf("%d ", i); } int main() { int i = 0; for(i=0; i<10; i++) { test(); } return 0; } //代码2 #include <stdio.h> void test() { //static修饰局部变量 static int i = 0; i++; printf("%d ", i); } int main() { int i = 0; for(i=0; i<10; i++) { test(); } return 0; }
我们发现了代码1打印的结果是10个1,代码2打印的结果是1-10十个数字.
我们由此得到了以下结论:
static修饰局部变量改变了变量的生命周期
让静态局部变量出了作用域依然存在,到程序结束,生命周期才结束
6.2.2 static修饰全局变量
//代码1 //在add.c文件中 int g_val = 2018; //test.c int main() { printf("%d\n", g_val); return 0; } //代码2 //在add.c文件中 static int g_val = 2018; //test.c int main() { printf("%d\n", g_val); return 0; }
我们发现代码1是正常打印的,而代码2发生了连接性错误.
由此我们得到以下结论:
一个全局变量被static修饰,使得这个全局变量只能在本源文件内使用,不能在其他源文件内使用。
6.2.3 static修饰函数
//代码1 //add.c int Add(int x, int y) { return c+y; } //test.c int main() { printf("%d\n", Add(2, 3)); return 0; } //代码2 //add.c static int Add(int x, int y) { return c+y; } //test.c int main() { printf("%d\n", Add(2, 3)); return 0; }
我们发现代码2出现了同样的问题,也在链接时发生错误,我们同样得到如下结论:
一个函数被static修饰,使得这个函数只能在本源文件内使用,不能在其他源文件内使用。
7. #define定义常量和宏
话不多说,我们直接上代码
//define定义标识符常量 #define MAX 1000 //define定义宏 #define ADD(x, y) ((x)+(y)) #include <stdio.h> int main() { int sum = ADD(2, 3); printf("sum = %d\n", sum); sum = 10*ADD(2, 3); printf("sum = %d\n", sum); return 0; }
8. 指针
这里只是对指针进行了解,并不包括它的大部分知识点.指针作为c/c++的重头戏,还是有一定难度的.我们先从内存说起.
8.1 内存
内存是电脑上特别重要的存储器,计算机中程序的运行都是在内存中进行的 。所以为了有效的使用内存,就把内存划分成一个个小的内存单元,每个内存单元的大小是1个字节。
为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地址。
变量是创建内存中的(在内存中分配空间的),每个内存单元都有地址,所以变量也是有地址的。
取出变量地址如下:
#include <stdio.h> int main() { int num = 10; #//取出num的地址 //注:这里num的4个字节,每个字节都有地址,取出的是第一个字节的地址(较小的地址) printf("%p\n", &num);//打印地址,%p是以地址的形式打印 return 0; }
这个时候,我们用来存储地址的时候,就用到了指针变量 .
int num = 10; int *p;//p为一个整形指针变量 p = # #include <stdio.h> int main() { int num = 10; int *p = # //取地址 *p = 20; //解引用(可以看做取地址的反操作,用来访问指针指向内存中的内容) return 0; }
既然有整形指针,我们也可以推广到其他类型的指针
#include <stdio.h> int main() { //字符指针 char ch = 'w'; char* pc = &ch; *pc = 'q'; printf("%c\n", ch); return 0; }
8.2 指针变量的大小
#include <stdio.h> //指针变量的大小取决于地址的大小 //32位平台下地址是32个bit位(即4个字节) //64位平台下地址是64个bit位(即8个字节) int main() { printf("%d\n", sizeof(char *)); printf("%d\n", sizeof(short *)); printf("%d\n", sizeof(int *)); printf("%d\n", sizeof(double *)); return 0; }
9.结构体
java和c++这类面向对象的编程语言都用类作为基本单位,类中就有包含很多种不同的属性,俺么这类复杂对象在c语言中又如何表示呢,我们就用结构体来描述这类复杂对象.
struct Stu { char name[20];//名字 int age; //年龄 char sex[5]; //性别 char id[15]; //学号 };
结构体的初始化与访问成员如下 :
//打印结构体信息 struct Stu s = {"张三", 20, "男", "20180101"}; //.为结构成员访问操作符 printf("name = %s age = %d sex = %s id = %s\n", s.name, s.age, s.sex, s.id); //->操作符 struct Stu *ps = &s; printf("name = %s age = %d sex = %s id = %s\n", ps->name, ps->age, ps->sex, ps->id);