C++在C语言的基础上嫁接了面向对象编程工具(面向对象编程是一门哲学,它通过对语言建模来适应问题,而不是对问题建模以适应语言)。
与大多数语言不同的是,C语言比其他语言更依赖库,因此需要一个标准库。
程序清单1.1 C源代码示例
#include<stdio.h>
int main(void)
{
int dogs;
printf("How many dogs do you have?\n");
scanf("%d",&dogs);
printf("So you have %d dog(s)!",dogs);
return 0;
}
在Windows和Macintosh提供的集成开发环境(IDE)中,用户可以在IDE中通过选择菜单中的选项或按下特殊键来编辑和执行C程序。最终生成的程序可通过单击或双击文件名或图标直接在操作系统中运行。
我使用的是dev-c++,生成可执行文件1.exe,存储在桌面上,双击即可运行。
传统上,可执行文件是可运行的程序。在常见环境(包括Windows命令提示符模式、UNIX终端模式和Linux终端模式)中运行程序要输入可执行文件的文件名,而其他环境可能要运行命令(如,在VAX中的VMS[2])或一些其他机制。
可执行文件是扩展名为exe的文件。在win10操作系统中,选择win+R,然后输入cmd,进入命令提示符模式,我的可执行文件1.exe存储在桌面上,所以输入cd转到桌面,然后输入我的可执行文件名1.exe即可得到同上的结果。
磨刀不误砍柴工,应该养成先规划再动手编写代码的好习惯,用纸和笔记录下程序的目标和设计框架。这样在编写代码的过程中会更加得心应手、条理清晰。
如果没有合理的规划,写出来的代码会十分混乱。
程序清单1.2 C程序
#include<stdio.h>
int main()
{
printf("Concrete contains garvel and cement.\n");
return 0;
}
用C语言编写程序时,编写的内容被储存在文本文件中,该文件被称为源代码文件(source code file)。
win10自带的记事本也可以编写C的源代码。源代码存储在文本文件中。但是源代码文件需要编译链接才能形成可执行的扩展名为exe的文件。 编译的过程将源代码转换成中间代码,链接的过程将中间代码与其他代码合并形成可执行文件。 源代码生成目标代码,最后生成可执行代码。这里的目标代码虽然已经是机器语言代码,但是没有充当着程序和操作系统之间的接口的启动代码和库函数
在linux操作系统上编译,Ubuntu 20.04.3 LTS 获得源文件: 使用vim命令进入编辑器,然后i表示insert,输入源代码即可。按住esc:wq表示退出并保存。 获得可执行文件: gcc -o 1 1.c可执行文件名默认为a.out,你也可以在-o后面为可执行文件命名。 执行文件: ./1
复习题
1.对编程而言,可移植性意味着什么? 2.解释源代码文件、目标代码文件和可执行文件有什么区别? 3.编程的7个主要步骤是什么? 4.编译器的任务是什么? 5.链接器的任务是什么?
GCC和最新发布的版本 C标准函数库
程序清单2.1 first.c程序
所有的C编译器软件包都提供stdio.h文件。该文件中包含了供编译器使用的输入和输出函数(如, printf())信息。该文件名的含义是标准输入/输出头文件。通常,在C程序顶部的信息集合被称为头文件
int是main()函数的返回类型。这表明main()函数返回的值是整数。返回到哪里?返回给操作系统。
操作系统和C库经常使用以一个或两个下划线字符开始的标识符(如,_kcab),因此最好避免在自己的程序中使用这种名称。 标准标签都以一个或两个下划线字符开始,如库标识符。这样的标识符都是保留的。这意味着,虽然使用它们没有语法错误,但是会导致名称冲突。 C语言的名称区分大小写,即把一个字母的大写和小写视为两个不同的字符。因此,stars和Stars、STARS都不同。
对于某些操作系统(包括Linux和UNIX),return语句有实际的用途。
程序清单2.2 fathm_ft.c程序
程序清单2.3 two_func.c程序
C标准建议,要为程序中用到的所有函数提供函数原型。标准include文件(包含文件)为标准库函数提供可函数原型。
定位语义错误的另一种方法是:在程序中的关键点插入额外的printf()语句,以监视制定变量值的变化。通过查看值的变化可以了解程序的执行情况。对程序的执行满意后,便可删除额外的 printf()语句,然后重新编译。
当程序出现错误时,可以一步一步查看程序的执行情况,或者在程序中间添加语句检查执行情况,或者调试都可以。 跟踪程序状态的方法有三种,一是自己逐步计算,二是在关键节点插入printf()语句,三是直接使用编译器自带的调试器。
如果使用关键字不当(如,用关键字作为变量名),编译器会将其视为语法错误。还有一些保留标识符(reserved identifier),C语言已经指定了它们的用途或保留它们的使用权,如果你使用这些标识符来表示其他意思会导致一些问题。因此,尽管它们也是有效的名称,不会引起语法错误,也不能随便使用。保留标识符包括那些以下划线字符开头的标识符和标准库函数名,如printf()。
编程练习
1.编写一个程序,调用一次 printf()函数,把你的姓名打印在一行。再调用一次 printf()函数,把你的姓名分别打印在两行。然后,再调用两次printf()函数,把你的姓名打印在一行。
#include <stdio.h>
int main()
{
printf("临风听暮蝉\n");
printf("临风\n听暮蝉\n");
printf("临风");
printf("听暮蝉");
return 0;
}
2.编写一个程序,打印你的姓名和地址。
#include <stdio.h>
int main()
{
printf("临风 听暮蝉\n");
printf("火星\n");
return 0;
}
3.编写一个程序把你的年龄转换成天数,并显示这两个值。这里不用考虑闰年的问题。
#include <stdio.h>
int main()
{
int age=300;
printf("年龄:%d\n天数:%d",age,age*365);
return 0;
}
4.编写一个程序,生成以下输出: For he’s a jolly good fellow! For he’s a jolly good fellow! For he’s a jolly good fellow! Which nobody can deny! 除了 main()函数以外,该程序还要调用两个自定义函数:一个名为jolly(),用于打印前 3 条消息,调用一次打印一条;另一个函数名为deny(),打印最后一条消息。
#include <stdio.h>
void jolly(void);
void deny(void);
int main()
{
jolly();
jolly();
jolly();
deny();
return 0;
}
void jolly(void)
{
printf("For he's a jolly good fellow!\n");
}
void deny(void)
{
printf("Which nobody can deny!\n");
}
5.编写一个程序,生成以下输出: Brazil, Russia, India, China India, China, Brazil, Russia 除了main()以外,该程序还要调用两个自定义函数:一个名为br(),调用一次打印一次“Brazil, Russia”;另一个名为ic(),调用一次打印一次“India, China”。其他内容在main()函数中完成。
#include <stdio.h>
void br(void);
void ic(void);
int main()
{
br();
printf(",");
ic();
printf("\n");
ic();
printf(",\n");
br();
return 0;
}
void br(void)
{
printf("Brazil, Russia");
}
void ic(void)
{
printf("India, China");
}
|