学习自中国大学MOOC(慕课)上,作为学习心得,这篇文章不对C语言的历史和编译器作解释,直接进入代码部分,会持续更新,如有错误,愿大家指出。
1.C语言的第一个程序
#include <stdio.h>
int main()
{
printf("Hello World!\n");
return 0;
}
我们来看这段代码,它能输出 Hello world!
- 头文件:其中include有包含的意思,是指这个程序需要用到头文件stdio.h中的函数,一个头文件会有多个函数,一个程序可能包含多个头文件(可以没有),总而言之,用就include,不用可以不include。
别忘了include前的井号
- 函数:函数就是一段已经写好的,可以帮我们实现某一任务的代码。这里面的printf就是一个函数(print为打印;输出,f是函数的英文function的首字母)它可以帮我们在命令行输出前面的字符串。
函数的使用一定要有括号
- 字符串:""双引号里面的Hello World!\n这一整段叫字符串,printf会原封不动得输出。而\n没被输出是因为它表示换行,如果非要输出\n,可以用\n。
除了字符串内,都必须使用英文标点符号
当然,你可以写成这样:
#include <stdio.h>
int main()
{
printf("你好\n");
return 0;
}
它能输出 你好
- 分号: C语言规定,在每个可执行语句的后面必须有分号。如:return 0;
最后来看这个:
int main()
{
return 0;
}
- 主函数:这是主函数,你写的代码都在这里面(除函数外),到将函数时会说明它的原理,现在只要知道每个程序都要有它,它是一个程序必要框架就行。
另:如果你看到这样写主函数的:
void main()
{
}
这是主函数的一种古老的写法,C99已经规定int是主函数的唯一写法。当然,如果你的编译器比较古老,说不定能通过。
C主要语言版本(ANSI C—C89—C95—C99—C11)
2.计算
2.1数字的输出
我们可以把数字直接放进字符串进行输出,如:
#include <stdio.h>
int main()
{
printf("123\n");
return 0;
}
很明显,它能输出 123
不过我们有一种更常用的方式:
#include <stdio.h>
int main()
{
printf("%d ",123);
printf("%f ",3.14);
printf("%d,%f\n",123,3.14);
return 0;
}
它能输出 123 3.14 123,3.14
- 初始化字符:其中%d和%f叫初始化字符,%d输出整数,%f输出小数,将要输出的数依次放在字符串后面,并用逗号隔开
我们也可以用它来输出算式的结果:
#include <stdio.h>
int main()
{
printf("23+43=%d\n", 23+43);
return 0;
}
它能输出 23+43=66
C语言中的加减乘除分别是+ - * /
两个整数用除法时的结果会直接舍弃小数部分
2.2变量
我们能不能做这样一个程序:让用户输入两个整数,并把它们的和算给用户看。
完成这个程序,我们还有两个问题:
- 1.怎么接受数据
- 2.怎么把收到的数据保存起来,以便用于运算
2.2.1变量的作用及定义
我们先看第二个问题,C语言提供了变量来让我们存放数据。
#include <stdio.h>
int main()
{
int a;
int b=1;
int c,d;
int e=1,f=1;
return 0;
}
定义一个变量,要用 变量类型 变量名;
-
变量类型:变量类型有许多种,如:int,double,long,short,char等,其中int为整形,即整数
-
变量名:变量名的命名遵循一定规则,必须是英文,数字,下划线,不能以数字开头,且字母区分大小写,还有不能使用C语言的关键字(或叫保留字)
C语言关键字(不需要记忆,会慢慢在学习中熟悉):
当你定义出一个变量时,电脑会根据类型划出一块内存让你放数据,但如果你没有对变量赋值,那那片内存本来有的值就是你变量的值。你可以用上面的代码printf查看一下a,c,d,的值,一定是一些乱七八糟的,如同34641103,15640335之类的值。
- 赋值和初始化:赋值就是给变量一个值,如a=5;就是让a的值为5,初始化就是变量的第一次赋值
可以用 变量类型 变量名=初始值; 在定义变量时进行初始化,如 int b=1;
可以用逗号将不同的变量名隔开以定义多个相同类型的变量,但只能分别赋值,不能直接 int e=f=1;你可以int e=1,f=1;,你可以int e, f; e=f=1;
每个变量使用前都应该要初始化
这样,我们的第二个问题就解决了
- 2.怎么把收到的数据保存起来,以便用于运算
2.2.2数据的读入
stdio.h头文件中包含了一个scanf函数,它可以帮助我们进行数据的读入。
#include <stdio.h>
int main()
{
int a,b;
scanf("%d %d",&a,&b);
printf("a=%d,b=%d\n",a,b);
return 0;
}
我们定义了int类型的a,b,并从用户处读取了两个整数分别赋给a,b,两个整数用空格隔开,接受数据的变量a,b前要加&符号,具体到指针那部分再讲。
尽量用空格隔开两个初始化字符
当然用户肯定有输入错误的情况,我们试试输入错误的情况::
- 输入一个数后就按回车(scanf不会认为你输入完了,它会一直等待,知道你输入一个字符——非空格,非回车,非Tab)
- 输入了非数字(scanf会将没有接受到值的变量原封不动,但如果它没有被初始化,就会赋为0)
另外,还有一个初学者理解有误的地方,scanf的字符串中的是必须要输入的东西,不是提示语:
#include <stdio.h>
int main()
{
int a,b;
scanf("a=%db=%d",&a,&b);
printf("a=%d,b=%d\n",a,b);
return 0;
}
如果写成这样,就要输入成 a=1b=0 这样的才能读到a和b的值。
如果要有提示语,可以在scanf前加一句末尾没有\n的printf,如:
#include <stdio.h>
int main()
{
int a;
printf("a=");
scanf("%d",&a);
printf("a=%d\n",a);
return 0;
}
这样,第一个问题也解决了
- 1.怎么接受数据
2.2.3注释
那么开头的程序就可以很轻松得写出来:
#include <stdio.h>
int main()
{
int a=0,b=0;
scanf("%d %d",&a,&b);
printf("a+b=%d\n",a+b);
return 0;
}
这个程序倒是很简单,但我们可以加点东西:
#include <stdio.h>
int main()
{
/*
//本程序可以计算两个整数的和
为正确输入的数视为0
*/
//定义两个参与运算的变量
int a=0,b=0;
scanf("%d %d",&a,&b);//接受变量的值
//计算并输出
printf("和为%d\n",a+b);
return 0;
}
-注释:注释是给人类看的,可以更清楚得让人明白你的程序的作用,计算机编译时会忽略
// 后的所有内容为注释,它是一个单行注释,一般出现在代码的上面或后面
从 /* 到 */中间的都为注释,它是一个多行注释,多行注释中可以有单行注释,但不能有多行注释
2.2.4常量
比如这个程序:
#include <stdio.h>
int main()
{
int a=0;
printf("请输入身高(cm):")
scanf("%d",&a);
printf("身高为%dm\n",a/100.0);
return 0;
}
它可以将你cm的身高转换成m,由于两个整数用除法时的结果会直接舍弃小数部分,所以我们用100.0代替100以保留小数部分。
如果这个100.0后面还要用到,我们能不能用一个变量把它保存起来,如:
#include <stdio.h>
int main()
{
int a=0;
double HIGHT=100.0;
printf("请输入身高(cm):")
scanf("%d",&a);
printf("身高为%dm\n",a/HIGHT);
return 0;
}
double表示双精度浮点数,我们下一章再讲,现在知道它可以定义小数就行。
相比会随着用户输入而变化的a,HIGHT的100.0不会改变,这种变量我们称为常量,常量的变量名通常全部使用大写,所以习惯是看到全是大写的变量就不更改。
#include <stdio.h>
int main()
{
int a=0;
const double HIGHT=100.0;
printf("请输入身高(cm):")
scanf("%d",&a);
printf("身高为%dm\n",a/HIGHT);
return 0;
}
C99以后,就可以加上const关键词使此变量不可被赋值,即除了定义时的初始化,其他时候它都不能出现在等号的左边,成了真正意义上的常量。
2.3数据类型
2.3.1整数
整数类型有以下几种:
数据类型 | 取值范围 | 所占字节 |
---|---|---|
整形(int) | -2147783648~2147483647 | 4 |
长整形(long) | -9223372036854774808~9223372036854774807 | 8 |
短整型(short) | -32768~32767 | 2 |
字符(char) | -128~127 | 1 |
另外,数据类型前可以加上signe(有符号),unsigne(无符号)两个关键字,如 signe long 或unsigne short表示有无正负号。singne可以省略,unsigne使用后取值范围变为0~原值的两倍-1
2.3.2小数
小数类型有以下几种:
数据类型 | 小数精度 | 所占字节 |
---|---|---|
单精度浮点数(float) | 6 | 4 |
双精度浮点数(double) | 15~17 | 8 |