本文只是简单介绍c语言,涉及到计算机原理的知识不会在这里讲解,建议再额外的阅读其他的c语言的书,如《C Primer Plus》《K&R C》等;学习c语言是需要计算机原理的知识的,如果没有可以阅读老刘的系列教程,并关注 码农翻身 公众号获取他的最新教程。学校发的谭某教材就算了吧,不怎么好用,据说还有些错误的地方,而且谭某使用的IDE软件不推荐使用。

你需要学会什么

使用什么IDE

CodeBlocks

CodeBlocks的代码补全能力很强,用着感觉很爽,写代码效率很高。另外奉上CodeBlocks创建c项目教程

Dev-C++

不推荐使用windows的文本文档编程,别人的程序放进去还有可能会乱码,而且界面看起来low,用过就知道确实不好用;如果真的不想用这些比较重的IDE,可以选择使用sublime atom这类编辑器

代码规范

代码基本规则

  • 在 .c 源文件开头引入源文件使用到的库函数的 .h 头文件
  • main 函数作为程序的入口函数,代码从这里开始运行
  • main 函数的返回类型使用 int
  • 每一句代码以 ; 结尾

其他一些默认代码规范

既然要写代码,肯定要遵循写代码的规则,本教程中的代码都会是符合默认的规范的;但是不同的公司对代码的编写规范可能略微的不同,今后在工作中更是要按照公司的规范编写代码。

个人建议可以参考RT-Thread 编程风格

数据类型

数据类型的话,一般整数用 int,上亿的数为了保险就用 long long;字符用 char;有小数的叫做 浮点数,不管什么,直接用 double,就好;无符号的就在前面加上 unsigned

下面展示的是所有的数据类型表示数据的大小,有很多没见过也没关系,先见一面。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <limits.h>
#include <stdio.h>

int main(int argc, char const *argv[])
{
printf("signed char类型的对象的最小值:%d\n", SCHAR_MIN);
printf("signed char类型的对象的最大值:%d\n", SCHAR_MAX);
printf("unsigned char类型的对象的最大值:%u\n", UCHAR_MAX);
printf("char类型的对象的最小值:%d\n", CHAR_MIN);
printf("char类型的对象的最大值:%d\n", CHAR_MAX);
printf("short int类型的对象的最大值:%d\n", SHRT_MIN);
printf("short int类型的对象的最大值:%d\n", SHRT_MAX);
printf("unsigned short int类型的对象的最大值:%u\n", USHRT_MAX);
printf("int类型的对象的最小值:%d\n", INT_MIN);
printf("int类型的对象的最大值:%d\n", INT_MAX);
printf("unsigned int类型的对象的最大值:%u\n", UINT_MAX);
printf("long int类型的对象的最小值:%ld\n", LONG_MIN);
printf("long int类型的对象的最大值:%ld\n", LONG_MAX);
printf("unsigned long int类型的对象的最大值:%lu\n", ULONG_MAX);

return 0;
}

c语言标准I/O

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>

int main(int argc, char const *argv[]) { //不用在意 int argc, char const *argv[] ,只是让你知道有这么一个东西而已
printf("这可以输出你想输出的\n");
printf("Even only a '\\n' is OK");
printf("\n");

int num;
printf("输入一个你想输出的数字: ");
scanf("%d", &num); //不能忽略'&'符号
printf("The num is %d\n", num);

return 0;
}

从上面这段程序就可以看出 输入 scanf输出 printf 的使用方法了。

格式化输入输出

1
2
scanf("%d", &num);                       //不能忽略'&'符号
printf("The num is %d\n", num);

注意到这两句代码的 %d 了没,这就是格式化输入输出,也叫做转换说明。就记个 %d %p %s %c 差不多就够用了,其他的以后用到了再学。

转换说明 输出
%a 浮点数、十六进制数和p-记数法(C99)
%A 浮点数、十六进制数和p-记数法(C99)
%c 一个字符
%d 有符号十进制整数
%e 浮点数、e-记数法
%E 浮点数、E-记数法
%f 浮点数、十进制记数法
%g 根据数值不同自动选择%f或%e。%e格式在指数小于-4或者大于等于精度时使用
%G 根据数值不同自动选择%f或%E。%E格式在指数小于-4或者大于等于精度时使用
%i 有符号十进制整数(与%d相同)
%o 无符号八进制整数
%p 指针
%s 字符串
%u 无符号十进制整数
%x 使用十六进制数字0f的无符号十六进制整数
%X 使用十六进制数字0F的无符号十六进制整数
%% 打印一个百分号

字符与字符串

上图就是一个字符串”Hello”,但是占据了6个空间,由6个字符构成,末尾有个’\0’字符。

这是因为c语言需要这个字符’\0’来表示这是一个完整的字符串。

以下是最常见的Ascii字符

运算符与表达式

基本运算符

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>

int main(int argc, char const *argv[])
{
printf("1+2=%d\n", 1+2); //加
printf("2-1=%d\n", 2-1); //减
printf("1*2=%d\n", 1*2); //乘
printf("1/3.0=%f\n", 1/3.0); //浮点数的除法
printf("1/3=%d\n", 1/3); //整数除法取整(整数部分)
printf("1%%3=%d\n", 1%3); //整数除法取模(余数部分)
return 0;
}

循环

for

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>

int main(int argc, char const *argv[])
{
int n;

for (n = 10; n > 0; n--) {

}

return 0;
}

while

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>

int main(int argc, char const *argv[])
{
int n = 10;

while (n > 0) {
n--;
}

return 0;
}

do-while

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>

int main(int argc, char const *argv[])
{
int n = 10;

do {
n--;
} while(n > 0);

return 0;
}

判断与分支

if-else

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>

int main(int argc, char const *argv[])
{
int n;

printf("Input a num: ");
scanf("%d", &n);

if (n > 0) {
n--;
} else if (n < 0){
n++;
} else {
;
}

printf("n=%d\n", n);

return 0;
}

switch-case

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>

int main(int argc, char const *argv[]) {
int n;

printf("Input a num: ");
scanf("%d", &n);

switch (n) {
case 1: printf("a\n");break;
case 2: printf("b\n");break;
case 3: printf("c\n");break;
}

return 0;
}

函数

数组

指针

参考源