本章主要讲解了开发环境的搭建、生成可执行文件的过程、C语言程序的基本框架等。
1) 为什么C语言代码必须有 main() 函数,而且只能有一个?
2) 有些编译器下,不写#include <stdio.h>也是正确的,这是为什么呢?
3) 解释源代码文件、目标文件和可执行文件的区别。
4) 编译器和链接器的主要任务是什么?
5) 什么是语法错误?什么是逻辑错误?请分别给出例子。
6) 用 printf() 输出\a时,有的电脑为什么听不到声音?
1) 编写一个C语言程序,输出如下的文本:
2) 编写一个C语言程序,先输出字符串Hello world,然后再输出http://www.cdsy.xyz,同时将Hello world覆盖掉,最终显示器上只有http://www.cdsy.xyz一个字符串。
小明刚学C语言,已经编写好了下面的程序,不知道自己写得对不对,想征求你的意见,请帮忙看看小明的代码有没有错误。如果有,有几个,分别是什么错误。
一. 问答题
1) 为什么C语言代码必须有 main() 函数,而且只能有一个?
main() 是C语言程序的入口函数,没有 main() 程序就没有入口,就不知道从哪里开始执行。
如果一个程序有多个 main() 函数,就会产生多个入口,程序就会“纠结”,不知道到底从哪个 main() 开始执行,所以会出错。
2) 有些编译器下,不写 #include <stdio.h> 也是正确的,这是为什么呢?
stdio.h 是一个常用的头文件,有的编译器会默认包含,所以即使不写也不会出错。但有的编译器就不行,不会默认包含 stdio.h,我们必须自己引入。
不管编译器会不会默认包含 stdio.h,我们都应该在代码的开头写上 #include <stdio.h>这条语句,这样才更加规范,才更加清晰。
3) 解释源代码文件、目标文件和可执行文件的区别。
源代码文件中包含着程序员用编程语言写的代码,是纯文本文件,内部没有特殊格式。
目标文件是二进制格式的,包含的是机器代码,但是它还缺少一些东西,不能直接运行。
可执行文件也是二进制格式的,包含的是完整的机器代码,可以直接运行。所有的目标文件和标准库、系统组件结合在一起就构成了可执行文件。
4) 编译器和链接器的主要任务是什么?
编译器把源代码转换成机器代码,也就是目标文件。
链接器将所有的目标文件、标准库、系统组件等组合在一起,生成一个完整的可执行程序。
5) 什么是语法错误?什么是逻辑错误?请分别给出例子。
语法错误是指代码不符合C语言的规范,编译器(或者链接器)不认可,编译不能通过,无法生成可执行文件。例如:
#include <stdio.h>
int main(){
puts("www.cdsy.xyz")
return 0;
}
puts() 函数的最后忘了写分号,这就是一个语法错误。
逻辑错误是指代码的思路不对,不能产生正确的结果。这样的错误编译器是不能发现的,只能靠我们自己去排错。有逻辑错误的代码依然能够通过编译,并生成可执行程序。例如我们想输出 hello world 这个字符串:
#include <stdio.h>
int main(){
puts("hello 1 world");
return 0;
}
程序最终输出的是 hello 1 world,多了一个“1”,事与愿违,这是由于我们马虎造成的。
实际编程中的逻辑错误有时候不好发现,我们可以借助调试工具跟踪程序的运行过程,看看在哪一个步骤出错了。这块的知识我们后续会专门讲解。
6) 用 printf() 输出 \a 时,有的电脑为什么听不到声音?
\a 是蜂鸣器发出的声音,而不是声卡(音响、喇叭)发出的声音。
蜂鸣器和声卡不是一个硬件,蜂鸣器主要用来报警,硬件出现故障时会听到它发出“嘀嘀”的声音。
现在的很多电脑已经不再集成蜂鸣器,所以输出 \a 时就听不到声音,这说明你的电脑已经非常“现代化”了。
二. 编程题
1) 编写一个C语言程序,输出如下的文本:
"The effect of '\n' characters is a newline," he said.
该题目中," 和 \n 都是特殊字符,不能直接输出,需要转义,也就是在前面加 \n。代码如下:
#include <stdio.h>
int main(){
puts("\"The effect of '\\n' characters is a newline,\" he said.");
return 0;
}
2) 编写一个C语言程序,先输出字符串 Hello world,然后再输出http://www.cdsy.xyz,同时将 Hello world 覆盖掉,最终显示器上只有http://www.cdsy.xyz 一个字符串。
我们先来看代码:
#include <stdio.h>
int main(){
puts("Hello world\rhttp://www.cdsy.xyz");
return 0;
}
注意 \r 的使用。\r 的作用是回车,也就是将光标移动到当前行的开头。
Hello world 输出完毕后,光标从最后位置回到开头位置,也就是字符 'H' 的位置,从这个位置开始输出 http://www.cdsy.xyz,自然就把 Hello world 覆盖掉了。
三. 找错题
小明刚学C语言,已经编写好了下面的程序,不知道自己写得对不对,想征求你的意见,请帮忙看看小明的代码有没有错误。如果有,有几个,分别是什么错误。
include stdio.h
int main(){
puts("I said "C language" is very good")
}
小明的代码错的一塌糊涂,有很多低级错误。
第1行中有两个错误:
include 前面要加 #,#include 是头文件包含命令,include 什么也不是。
应该讲 stdio.h 用 <> 包围起来。
第3行中有两个错误:
调用 puts() 函数是一条完整的语言,应该在最后加分号 ;。
字符串中的 " 应该被转义,也就是写作 I said \"C language\" is very good。
最后一个错误是 main() 函数最后忘了写返回值,应该加上 return 0;。