黑夜给了我黑色的眼睛,我却用它来寻找光明
好吧,当初说好的要努力奋斗,也有点意志消磨殆尽了。当然,这不是原因之一,也有确实大学不必高中,更忙碌也更清闲,忙碌的人不会清闲,清闲的人只会更清闲。
相信绝大多数大一的同学已经对C有所接触了吧。那就不多说废话了,我们接着n个月之前的话题接着总结吧!
#include <stdio.h>//一个C程序
int main()
{
int num; //定义一个名叫num的变量
num = 8; //为num变量赋值为8
printf("The num is %d.\n",num);//向屏幕输出变量num的值
return 0;
}
以上还是一段简单的C程序,这次先大致分析一下这个C程序里面的各个部分。
#include <stdio.h> <- 包含另一个文件
int main() <- 主函数,程序运行的入口
{ <- 函数体的开始
int num; <- 声明语句
num = 8; <- 赋值语句
printf("The num is %d.\n",num); <- 调用printf函数实现输出字符
return 0; <- 返回语句
} <- 函数体结束
一、C文件到可执行程序
.c文件到可执行文件,在Windows系统上它会经过两个个步骤生成可以运行的.exe文件。首先,.c文件会由编译器生成目标代码.o文件,然后.o文件会由链接器将启动代码和库函数的代码。
.o文件是由编译器将你书写的代码转换为了二进制代码,然而这样的代码还不能够运行,它还缺少一些内容。紧接其后的链接器会完成这部分的工作,启动代码相当于你的程序和计算机系统之间的接口,库函数代码是一些你所用到函数的代码。
二、#include与头文件#include <stdio.h>
#include 语句被称为C语言的预处理指令的一个例子,它的作用是在程序的该位置插入了一份stdio.h文件的内容,实际上也就是一种copy的动作。通常,C程序在运行之前都会进行一系列的操作,这叫做预处理。
而stdio.h又被称为头文件,它包含了有关输入输出的标准库函数,这些库函数构成了其完整内容。其中有以下内容:
函数原型:
文件访问
fopen
freopen
fflush
fclose
二进制输入/输出
fread
fwrite
非格式化输入/输出
fgetc/getc
fputc/putc
ungetc
fgets : 从流中读取n-1个字符或读完一行,参数str用于接收读取的字符串。注意当读取一行时,不包括行尾的'\n'字符。
fputs
格式化输入/输出
scanf/fscanf/sscanf
printf/fprintf/sprintf
perror
文件定位
ftell
fseek
fgetpos
fsetpos
rewind
错误处理
feof
ferror
文件操作
remove
rename
tmpfile 生成一个临时文件
tmpnam 生成一个唯一的文件名常数
EOF
一个用于指明到达文件尾部,值为负的有符号整形数。
NULL
一个由宏展开的空指针常量。或者说,是一个代表在内存中不是合法地址的常量。
SEEK_CUR
一个传给函数fseek()的整形参数,要求文件指针以相对于当前位置的偏移量定位。
SEEK_END
一个传给函数fseek()的整形参数,要求文件指针以相对于文件尾部的偏移量定位。
SEEK_SET
一个传给函数fseek()的整形参数,要求文件指针以相对于文件头部的偏移量定位。变量
stdin
标准输入流指针,负责传递来自标准输入的文字输入流(通常是键盘)。
stdout
标准输出流指针,负责传递到标准输出的文字输出流(通常是显示终端)。
stderr
标准错误输出流指针,传递来自所有输入输出中返回的错误信息(通常是显示终端)。数据结构
FILE
一个包含对文件流或文本流执行读入或输出所需信息的结构。其中包括:
一个文件描述符;
当前流的位置;
文件尾部指示;
错误指示;
指向流缓冲区的指针(如果适用)。
size_t
sizeof操作符对应的无符号整形数类型。
完全看不懂,没有关系,因为我也看不完全懂,毕竟说好的菜鸟嘛?(摊手)但是你最好要混个眼熟,因为在相当长的时间里你的老师是不会讲这些内容的,而其中有些东西确实是会有用到的,比如对于EOF,end of file,就有可能用于处理多测试样例的问题中,但至少到现在为止,我的C语言老师是没有提到的。(这与学校好坏无关,毕竟不是所有的老师都很优秀,也不是所有的老师都很不学无术。)Anyway,最好多看多code。
通常的C会有很多的头文件,但实际上其中会包括了很多构成最终可执行程序时编译器需要用到的东西,比如函数的函数名及如何使用函数。但它不包括你用到的函数的具体代码,函数的具体代码被包含在预编译代码的库文件中,它会在链接的过程中被链接器加入你的程序中。
是否需要包含头文件具体取决与你的具体实现,就像如果你需要使用printf()或是scanf()这两个函数,那么你需要包括的就是stdio.h,如果需要使用其他的函数,就可能要包含其他的头文件。一般讲来,如果你需要使用的函数并没有涉及到某个头文件,那么最好不要包括它。(这里就要吐槽一下我们的老师,他教我们时候的代码总会包括两个头文件,stdio.h、stdlib.h,搞得我们由同学以为这两个部分是C代码不可或缺的一部分)
三、main()函数int main()
main函数是一般程序运行的开始,你的代码必须由有且仅有一个main函数。main后面的圆括号表示它是一个函数,括号里面包含了一些传递给函数的信息。int表明main函数会返回一个整数类型的返回值。
也许你可能会看到这样的写法:
void main()
main()
但你最好写成返回int的形式,在C99标准里是不可以写成最后一种形式的,而void的返回,也没有标准里讲到可以使用。写代码最好写成最为标准的形式,不要因为偷懒而去做那些可能会损害自己的行为。
三、{ }{
}
在最开始的代码中,{ }标定了main函数的开始和结束,它的中间包括的main函数的所有主体内容。一般所有的函数都是由{ }来包括它的函数体部分,你不可以缺少它们中间的任何一个。
四、声明语句int num;
这句被叫做声明语句,声明语句是C中很重要的一部分。在本句中,它声明了一个名为num的int型变量。num被称为标识符或标志符,它需要满足一些条件,首先它的首字母的地方只能够字母和下划线,然后之后的地方只能是字母或下划线或数字,最后你不可以使用和C语言预留的关键字重名,就是说C语言中保留了一些名称专用,你不可以随意使用。
另外,所有的变量在使用之前必须定义。C99之前如果你想要使用某些变量,你必须将变量定义在代码块之前,在这之前不可以写其他语句,但C99允许你将变量的声明写在代码的任意位置,但这之前仍必须要先声明。
五、赋值语句num = 8;
这是一个赋值语句。在前面的声明语句中,我们定义了一个名为num的变量,计算机会为这个变量划分一定的内存空间,赋值语句就使得我们向其中写入了一个数值,8。
六、printf()函数printf("The num is %d.\n",num);
我们在这里使用了标准库为我们提供的输出到屏幕的函数,圆括号里面使它的参数,就是我们要交给printf函数去处理的内容。其中像“The num is”的这类字符是普通字符,"%d"是输出的说明符,不同的数据之间会有不同的说明符,"\n"这种前面带有\符号的叫做转义字符,C中有一些有特殊意义的字符它们会以\开头。如果你想要输出"\"符号,那么你需要这么写,"\\"那么printf就可以输出"\"这个符号了。
七、return语句return 0;
这里return语句是main函数需要返回的值,这在C标准中是明确不可缺少,它会返回正数类型的值,在这里的返回值是0,它表示程序到这里就main函数就结束了。如果你没有写return语句,也许你可能会通过编译,但可能会有警告,你最好写上它。
八、注释及代码风格//一个C程序
//定义一个名叫num的变量
像这种的句子叫做注释,在C中分为两种注释,单行注释//和多行注释/**/。注释在编译的运行过程中会编译器忽略过去,注释的编写是给人看的,也就是说写注释是为了说明这一块的代码内容,它可以让你在很长时间之后能够很快地回想或是理解你自己的代码。就像网上有段子说有coder翻到一段程序连连谩骂是谁写的代码,一行注释都没有,其实是他自己的代码。但更多的是你的代码是给别人看到,就像我们在上交C代码作业时需要在文件中用注释的方式写明题号及结果,它是给老师看的,如果你不写,那估计就是0分了。虽然这个例子不足以说明注释的重要性,但它实际上会严重地影响我们的一种代码风格。
编程是一门艺术,的确,一个漂亮的代码可以让它读起来如同诗歌一般,它是有节奏的、有生命的。良好的代码风格不仅仅会影响到代码的可读性,更会影响的是阅读人的心情。就像有的同学喜欢把变量命名成拼音、语句之间的最起码空格换行都没有等等,甚至我还看见给变量命名成拼音的缩写(我的老师曾今就这么干过),这些都是不应出现的,不然当你有了问题时去请教他人,难道还要别人来慢慢猜你的代码时什么意思吗?
所以说我们应当养成良好的代码风格,无论是平时的编程练习,还是以后真正走上coder的道路,这都是不应该放弃的最低标准。
参考资料:
维基百科编者. Stdio.h[G/OL]. 维基百科, 2016(20161207)[2016-12-07]. https://zh.wikipedia.org/w/index.php?title=Stdio.h&oldid=42385064.
热门评论
同样说一下stdio.h,我们老师在第一节课的时候就说所有的程序都要加上这个,其实到了后面的学习根本不用,好无语?。
写的很好辛苦了 非要十个字吗
同样说一下stdio.h,我们老师在第一节课的时候就说所有的程序都要加上这个,其实到了后面的学习根本不用,好无语?。