1编写一个简单的C程序
输出你好C语言
#include<stdio.h>
int main()
{
printf("你好C语言\n");
return 0;
}
其中main函数代表”主“程序
printf代表标准输入/输出库,产生的格式化输出
\n代表换行操作
return 0;代表程序终止会向操作系统返回值0
1.1
(1)预处理:首先程序会被交给预处理器。预处理器执行以#开头的指令(通常称为指令)。预处理器有点类似于编辑器,它可以给程序添加内容,也可以修改程序。
(2)编译:修改后的程序现在可以进人编译器了。编译器会把程序翻译成机器语言指令(即目标代码)。然而,这样的程序还是不可以运行的。
(3)链接:在最后一个步骤中,链接器把由编译器产生的目标代码和所需的其他附加代码整合在一起, 这样才最终产生了完全可执行的程序。这些附加代码包括程序中用到的库函数(如printf函数)。
1.2集成开发环境
我们一直通过在操作系统提供特殊的窗口中输入命令行的方式来调用命令行编译器。而实际上我们还可以选集成开发环境来进行编译。
那么什么是集成开发环境呢?简单来说,集成开发环境就是一个软件包。我们可以在其中进行编辑,编译,链接,执行甚至调试程序。并且它还可以在程序中有错误时突出显示。
集成开发环境有很多种,这里就不进行一一赘述了,如果想详细了解可以点击这个链接。
2.C语言简单程序的一般形式
一般有:
#include<stdio.h>
int main()
{
语句
}
C语言非常的依赖缩进以及特殊符号。哪怕是最简单的c程序也依赖三个关键的语言特性,即指令,函数以及语句。
2.1指令
在编译C程序之前,预处理器会首先对其进行编辑。我们把预处理器执行的命令称为指令。
如这里多#inelude指令。
程序由下面这行指令开始:
#include <stdio.h>
这条指令说明,在编译前把<stdio. h>中的信息“包含” 到程序中。<staio.h>包含c标准输
入/输出库的信息。C语言拥有大量类似于<stdio . h>的头 ,每个头都包含
一些标准库的内容。这段程序中包含<stdio.h>的原因是C语言不同于其他的编程语言,它没
有内置的“读”和“写”命令。输入/输出功能由标准库中的函数实现。
所有指令都是以字符#开始的。这个字符可以把C程序中的指令和其他代码区分开来。指
令默认只占一行,每条指令的结尾没有分号或其他特殊标记。
2.2函数
函数类似于其他编程语言中的过程或者是子过程。他们是用来构建程序的构建块,事实上c语言
就是函数的结合,函数一共分为两大类。第一类是程序员编写的函数,另一类是作为c语言实现一
部分提供的函数。第二种也简称为库函数。
这里需要特别注意。1、main函数几乎是每一个程序都必有的,他的地位非常的特殊。在执行程序
的过程中,系统会自动调用main函数。在此之前的所有程序都只能包含一个main函数。
2、main前面的int表示函数将返回一个整数值。
3、return函数它有两个非常特别的作用,第一个使main函数终止,从而结束程序。第二个是指
main函数的返回值是0而返回值为零,这表明这个程序正常终止。
假如假如main函数的末尾没有这条语句,但是它仍可以终止,那么大概率,你的编译器会产生一条警告信息。因为函数应该返回一个整数,却没有这么做。
2.3语句
语句是程序运行时执行的命令,这里这一个程序我们只用到了两种语句。
第一种是返回语句,另外一种是函数调用语句。(要求某一个函数执行分配给他的任务即称为调用
这个函数。)
例如我们这里的这一个程序就调用了printf函数。输出了:
你好C语言
这里有一点要特别特别注意c语言规定每一条语句后面要以分号结尾。(但是这条规矩有一个例外,
就是如果后续遇到了复合语句就可以不使用分号结尾。)至于原因就是因为符合语句,它可以连续
占用很多行,有时候很难确定它会哪一行为他的结束位置。而封号是用来显示语句结束的位置。指
令通常只在一行,因此所以他不需要用分号结尾。
2.4显示字符串
在这里我们用printf函数显示了一个字符串,当显示结束的时候,printf函数它不会自动跳到下一行
进行输出。如果我们想让它跳转到下一行输出那么我们就必须要在所包含的字符串中加上换行符,
而加上换行符就意味着终止前进,然后把后续的输出转到下一行。
这样我们就可以思考一下如何把语句
你好C语言
变为:
你好
C语言
这里我们就可以想到两种写法。请看如下代码。
#include<stdio.h>
innt main()
{
printf("你好\nC语言");
printf("你好\n");
printf("C语言");
teturn 0;
}
第一种直接在语句中间就加换行符。当然一条语句中你可以多加很多个换行符
或者是直接用两个printf函数。本人更建议使用第一种。
3.注释
我们上面儿写的那个文件,他没有进行说明。但是每一个程序都应该包含具体的识别信息。比如程序的名字,编写的日期,作者以及这个程序是干嘛用的?在c语言中,我们可以用/*符号标记注释的开始。*/符号标记注释的结束。比如,下面的代码。
/*都看到这里了,你真的不想点个赞吗?或者收藏一下子。
只要博主一直在学习,就会持续的更新。*/
4.1变量与赋值
在程序运行的过程中用于临时存储数据的单位,我们称之为变量。
4.2类型
每一个变量都必须有一个类型用来说明变量所存储的数据的种类。现在我们提到的两种类型分别为
int类型和float类型,因为类型会影响变量的存储方式以及允许对变量进行操作。所以选择合适类型
非常的关键。
其中int类型变量可以存储整数,如0,12,3这种。甚至副整数也可以。如-123,但是其取值范围
并不是无限的,通常最大的整数是2147483647,但某些计算机上也有可能是32767。
而float类型变量可以存储在小数位数的数据。如3.41456,但并非本身没有缺陷。进行算术运算时
float类型变量通常比int型慢(这里还有更值得注意的一点就是此类型变量的数值往往只是实际数值的一个近似值。比如你存储0.1,但是你可能发现后面实际的值可能是0.09999999999985,就是舍入造成的误差。)
4.3声明
在使用变量之前必须对其声明,为了声明变量,首先我们要指定变量的类型,然后说明变量的名字。变量的名字我们可以由程序员自己决定。可以这样声明两个变量height和procit
#include <stdio.h>
int main()
{
int height;
float profit;
}
第一条声明说明height是一个整形变量,也就意味着它可以储存一个整数值。第二条声明则表示procit是一个浮点型变量。
这里如果有几个变量,它是相同的类型,就可以这样把它们声明:
#inclde<stdio.h>
innt main()
{
int height, school,bolue;
float profit,rot;
}
特别注意每一条完整的声明都要以分号结尾。(就是说如果你要调用一个函数,如果函数在调用之前可以不声明,如果在调用之后,就得吧函数声明写在前面);
4.4赋值
变量通过赋值的方式获得值。例如,:
#include<stdio.h>
int main()
{
water = 12;
red = 4;
bioue =88;
}
将数值12,4,和88分别赋给变量water,red,bioue。 12,4和88称为常量。
变量在赋值或者是其他使用之前,必须要先进行声明。例如:
#include<stdio.h>
int main()
{int water;
water =12;
}
不进行声明就可能引用会报错。
如果是为float型变量赋值则带小数点。而当我们把一个小数点儿的常量赋值给float变量时,最好应该在后面加一个f代表( float型)。
#include<stdio.h>
int main()
{
float puite;
puite =1123.65f;
}
变量一旦被复制就可以用来计算其他变量的值。:
#include<stdio.h>
int main()
{
int red,wed,wse;
red = 12;
wed = 34;
wes = red*wed;
}
* 代表乘号,上述语句把存在red,wed串变量相乘后把运算的结果直接赋给变量wes。通常情况下赋值运算的右侧可以是一个含有常量,变量和运算符的公式。在C语言中的术语叫表达式。
4.5显示变量的值
用printf可以显示出变量当前值以
为例
#include <stdio.h>
int main()
{
int http;
http = m;
}
这里的m表示变量http的当前值,我们当可通过对如下printf的调用实现输出上还信息的要求
#include <stdio.h>
int main()
{
int http;
http = m;
printf("%d",http)
}
注:% d对应int型,%f对应float型其中%f会默认显示出小数点后六位。如果要强制其后面的小数点位数,可以在白符号和f之间添加 .位数如:
#include <stdio.h>
int main(void)
{
float http;
http =123.456;
printf("%.2f",http);
}
这样的情况就是保留两位小数,输出结果就是123.45
计算箱子的空间重量
运输公司特别不喜欢又大又轻的箱子,因为箱子在卡车或飞机上运输时要占据宝贵的空间。
事实上,对于这类箱子,运输公司常常要求按照箱子的体积而不是重量来支付额外的费用。在
美国,通常的做法是把体积除以166 (这是每磅允许的立方英寸数)。如果除得的商(也就是
箱子的“空间”重量或“体积”重量)大于箱子的实际重量,那么运费就按照空间重量来计算。
(除数166是针对国际运输的)
假设运输公同雇你来编写一个计算箱于空间重最的程序。因为刚开始学习C语言,所以
你决定先编写个计算特定箱子 空间重量的程序来试试身手, 其中箱子的长、宽、高分是12
英寸、10英寸和8英寸。C语言中除法运算用符号/表示。所以,显然计算箱子空间重量的公式
如下:
weight = volume / 166;
这里的weight和volume都是整型变量,分别用来表示箱子的重量和体积。但是上面这个公式
并不是我们所需要的。在C语言中,如果两个整数相除,那么结果会被“截短”:小数点后的
所有数字都会丢失。12英寸x10英寸x8英寸的箱子体积是960立方英寸,960除以166的结
果是5而不是5.783,这样使得重量向下舍人,运输公司则希望结果向上舍人。- -种解决方案是
在除以166之前把体积数加上165:
weight = (volume + 165) / 166;
这样体积为166立方英寸的箱子空间重量就为331/166舍入为1,而体积为167立方英寸的箱子的空间重量则为332/166舍入为2
#include<stdio.h>
int main(void)
{
int height, length, width, volume, weight;
height = 8;
length = 12;
width = 10;
volume = height * length * width;
weight = (volume + 165) / 166;
printf("这个箱子的长宽高分别为:%d %d %d\n", height, length, width);
printf("体积为:%d \n" ,volume);
printf("空间重量为:%d\n", weight);
return 0;
}
4.6初始化
当程序开始执行时,某一些变量会被自动设置成为零,而大多数变量不会。没有默认值,并且尚未
保存在程序中被赋值的变量是为初始化的。
当然也可以通过采用赋值的方法给变量赋出值,但还有更简单的方法,在变量声明中我们就给他加
入初始值。
#innclude<stdio.h>
int main()
{
int web = 8,http = 10,apple;
}
按照c语言的术语,数字8就是一个初始化器。
在同一个生命中,我们也可以对任意数量的变量进行初始化。web拥有了初始化器8,而变量apple没有。说明他未进行初始化。
4.7显示表达式的值
printf的功能不仅局限于显示变量中存储的数,它可以显示任意数值表达式的值,利用这一特性可以简化程序,又可以减少变量的数量比如
#innclude<stdio.h>
int main()
{
int web = 8,http = 10,apple;
apple = web*http;
printf("%d",apple);
/*可以替换为:printf("%d",web*http);*/
}
注意,显示表达式的值的能力说明了c语言的一个通用规则。在任何需要素质的地方都可以使用具有相同类型的表达式。
5.读入输入
刚才计算箱子的空间重量,那个并不是非常的实用,为了改进程序,我们需要把它修改成需要用户
自行输入相等的尺寸。
这里就不得不提到一个全新的函数。scanf函数,它与printf函数在C函数库中相对应,都需要使用
格式串来指定输入数据或者输出数据的形式。但是这里如果你输入什么类型的数据,你就要用对应
的百分号比如说数整数就得用%d,输入小数就得用浮点型%f。
输出格式为:
#include<stdio.h>
int main()
{
int m;
scanf("%d"&m);
/*
&是取地址符
*/
}
计算箱子的空间重量(升级版)
#include<stdio.h>
int main(void)
{
int height, length, width, volume, weight;
printf("这个箱子的长为:");
scanf("%d", &height);
printf("这个箱子的宽为:");
scanf("%d", &length);
printf("这个箱子的高为:");
scanf("%d", &width);
volume = height * length * width;
weight = (volume + 165) / 166;
printf("体积为:%d \n" ,volume);
printf("空间重量为:%d\n", weight);
return 0;
}
6.定义常量的名字
为了以后阅读程序时会有人不明白常量含义,因此可以采用称为宏定义的特性对常量命名:
#define HTTP_TP 12839
这里的# define是预处理指令,类似于# include不用在结尾加分号。
对程序进行编译时,预处理器会把每一个宏替换为目标值比如
#inclde<stdio.h>
#define HTTP_TP 12345
int main()
{
int wed,asd;
wsd=(HTTP_TP*asd)/HTTP_TP;
/*wsd=(HTTP_TP*asd)/HTTP_TP就等于wed=(12345*asd)/12345*/
}
当然宏也可以定义表达式
#define YU_KL (1234/234)*675
注意,宏的名字只用大写字母,这是大多数程序员遵守的规范。
程序:华氏温度转为摄氏温度
#include<stdio.h>
#define FREEZING_GT 32.0f
#define SCALE_FACTOR (5.0f /9.0f)
int main(void)
{
float fahrenheit,celsius;
printf("请输入华氏温度:");
scanf("%f", &fahrenheit);
celsius = (fahrenheit - FREEZING_GT) * SCALE_FACTOR;
printf("摄氏温度为:%.1f\n", celsius);
return 0;
}
把华氏温度转换为相应的摄氏温度。因为FREZING_PT表示的是常量32.0f,而SCAL_FACTOR
表示的是表达式(5.0f / 9.0f), 所以编译器会把这条语句看成
celsius = ( fahrenheit - 32.0f) * (5.0f / 9.0f) ;
在定义SCALE_FACTOR时,表达式采用(5.0f / 9.0f) 的形式而不是(5 / 9)的形式,这一点
非常重要,因为如果两个整数相除,那么C语言会对结果向下舍人。表达式(5 / 9)的值为0,
这并不是我们想要的。
最后的printf函数调用输出相应的摄氏温度:
printf("摄氏温度为.1f\n",celsius) ;
注意,使用%.1f显示celsius的值时,小数点后只显示一位数字。
7.标识符
在编写程序是需要对变量,函数,宏和其他实体进行命名,这些名字为标识符。在c语言中,标识
符可以含有字母,数字下划线,但是必须以字母或者下划线开头。
下面是合法标识符的-些示例:
times10 get_ next_ char_ done
接下来这些则是不合法的标识符:
10times get -next -char
不合法的原因:符号10t imes是以数字而不是以字母或下划线开头的;
符号get-next-char包含了减号,而不是下划线。
C语言是区分大小写的:也就是说,在标识符中C语言区分大写字母和小写字母。例如,
下列8个标识符全是不同的:
job joB job jOB Job JoB JOb JOB
上述8个标识符可以同时使用,且每一个都有完全不同的意义。(看起来使人困惑!)除非标识
符之间存在某种关联,否则明智的程序员会尽量使标识符看起来各不相同。
因为c语言是区分大小写的,所以许多程序员会遵循在标识符中只使用小写字母的规范(宏
命名除外)。为了使名字清晰,必要时还会插人下划线:
symbol_table current_page name_and address
而另外- -些程序员则避免使用下划线,他们的方法是把标识符中的每个单词用大写字母开头:
SymbolTable CurrentPage NaneAndAddress
(第一个字母有时候也用大写。)前-种风格在传统C中很常见,但现在后面的风格更流行一些
这主要归功于它在Java和C# (以及C++)中的广“泛使用。当然还存在其他些 合理的规范,
只要保证整个程序中对同一标识符按照同一种方式使用大写字母就行。
关键字
8.C程序的书写规范
1、在熟悉程序的时候,可以添加适当的空格式程序。便于阅读和理解。
2、语句可以分开放在任意多行内
#inclde<stdio.h>
int main()
{
int asd,zxc,vbnm,hjk;
printf("点个赞吧求求了:%d",
asd*zxc*vbnm/hjk+asd);
}
3、书记会有利于我们轻松识别程序的检讨,为了清楚的表示出声明和语句都嵌套在mian函数中我
们应该对它进行缩进。
4、空行可以把程序划分成逻辑单元,从而使程序员更清楚的辨别程序结构,没有空号的程序很难
阅读。
5、可以在记号之间添加额外的空格,但是绝不可以在记号内添加空格,否则会改变程序的意思,
引发错误。例:
#inclde<stdio.h>
int main()
{
int asd,zxc,vbnm,hjk;/*正确*/
flo /*错误*/
at qwe; /*错误*/
}