论坛网站开发费用,服务外包平台,交换友情链接的渠道,easyphp搭建wordpressC Primer 第1章 开始 1.1 编写一个简单的C程序1.1.1 编译、运行程序一、程序源文件命名约定二、从命令行运行编译器 练习 1.2 初识输入输出一、标准输入输出对象二、一个使用IO库的程序三、向流写入数据四、使用标准库中的名字五、从流读取数据六、完成程序 1.3 注释简介一、C中… C Primer 第1章 开始 1.1 编写一个简单的C程序1.1.1 编译、运行程序一、程序源文件命名约定二、从命令行运行编译器 练习 1.2 初识输入输出一、标准输入输出对象二、一个使用IO库的程序三、向流写入数据四、使用标准库中的名字五、从流读取数据六、完成程序 1.3 注释简介一、C中注释的种类二、注释界定符不能嵌套 1.4 控制流1.4.1 while语句1.4.2 for语句练习1.4.3 读取数量不定的输入数据1.4.4 if语句 1.5 类简介1.5.1 Sales_item类一、读写Sales_item二、Sales_item对象的加法 1.5.2 初识成员函数一、什么是成员函数 1.6 书店程序小结术语 1.1 编写一个简单的C程序
每个C程序都包含一个或多个函数其中一个必须命名为main。操作系统通过调用main来运行C程序。
// main函数的返回类型必须为int
int main()
{return 0; // 在大多数系统中main的返回值被用来指示状态。返回值0表明成功非0的返回值的含义由系统定义通常用来指出错误类型
}一个函数的定义包含四部分 1返回类型 2函数名 3一个括号包围的形参列表允许为空 4函数体以左花括号开始以右花括号结束的语句块
1.1.1 编译、运行程序
一、程序源文件命名约定
源文件后缀.cc、.cxx、.cpp、.cp、.C
二、从命令行运行编译器
// CC是编译器程序的名字$是系统提示符
$ CC prog1.cc// 编译器生成一个可执行文件Windows系统将可执行文件命名为prog1.exeUNIX系统将可执行文件命名为a.out
// 在Windows系统中运行可执行文件
$ prog1 // 可忽略扩展名.exe
$ .\prog1 // .后跟一个反斜线指出文件在当前目录中
// 在UNIX系统中运行可执行文件
$ a.out
$ ./a.out // .后跟一个斜线来指出可执行文件位于当前目录中// 访问main的返回值的方法依赖于系统
// 在UNIX和Windows系统中执行完一个程序后都可以通过echo命令获得其返回值
$ echo $? // UNIX
$ echo %ERRORLEVEL% // Windows// 运行GNU编译器的命令是g
$ g -o prog1 prog1.cc
// $是系统提示符
// -o prog1是编译器参数指定了可执行文件的文件名。
// 在不同的操作系统中此命令生成一个名为prog1UNIX或prog1.exeWindows的可执行文件
// 如果省略了-o prog1参数在UNIX系统中编译器会生成一个名为a.out的可执行文件在Windows系统中会生成一个名为a.exe的可执行文件
// 根据使用的GNU编译器的版本可能需要指定-stdc0x参数打开对C11的支持// 运行微软Visual Studio编译器的命令为c1
C:\Users\me\Programs c1 /EHsc prog1.cpp
// C:\Users\me\Programs是系统提示符Users\me\Programs是当前目录名
// 命令c1调用编译器/EHsc是编译器选项用来打开标准异常处理
// 微软编译器会自动生成一个可执行文件prog1.exe// 编译器通常都包含一些选项能对有问题的程序结构发出警告。
// GNU编译器使用-Wall选项
// 微软编译器使用/W4练习
Windows 7操作系统并不处理或报告程序返回的错误标识直观上返回-1的程序与返回0的程序在执行效果上并无不同。但环境变量ERRORLEVEL记录了上一个程序的返回值。因此在控制台窗口执行修改后的程序接着执行echo %ERRORLEVEL%会输出-1。在Linux系统中执行echo $?有类似效果。
1.2 初识输入输出
iostream库包含两个基础类型istream和ostream分别表示输入流和输出流。
一、标准输入输出对象
1、标准输入cinistream类型对象 2、标准输出coutostream类型对象 3、标准错误cerrostream类型对象输出警告和错误消息。默认情况下写到cerr的数据是不缓冲的。 4、clogostream类型对象输出程序运行时的一般性信息。默认情况下写到clog的数据是被缓冲的。 系统通常将程序所运行的窗口与这些对象关联起来。当我们读取cin数据将从程序正在运行的窗口读入当我们向cout、cerr和clog写入数据时将会写到同一个窗口。
二、一个使用IO库的程序
#include iostreamint main()
{// 输出运算符左侧必须是ostream对象右侧是要打印的值// 此运算符将给定的值写到给定的ostream对象中输出运算符的计算结果就是其左侧运算对象// 前缀std::指出名字cout和endl是定义在名为std的命名空间中的std::cout Enter two numbers: std::endl;// 写入endl的效果是结束当前行并将与设备关联的缓冲区中的内容刷到设备中。缓冲刷新操作可以保证到目前为止程序所产生的所有输出都真正写入输出流中而不是仅停留在内存中等待写入流int v1 0, v2 0;// 输入运算符左侧必须是istream对象右侧为给定对象// 从给定的istream读入数据并存到给定对象中输入运算符返回其左侧运算对象作为其计算结果std::cin v1 v2;std::cout The sum of v1 and v2 is v1 v2 std::endl;return 0;
}三、向流写入数据
在C中一个表达式产生一个计算结果它由一个或多个运算对象和通常是一个运算符组成。
四、使用标准库中的名字
标准库定义的所有名字都在命名空间std中。
五、从流读取数据
六、完成程序
1.3 注释简介
一、C中注释的种类
1、单行注释以双斜线//开始以换行符结束。 2、界定符对注释以 /* 开始以 */ 结束。当注释界定符跨越多行时最好能显式指出其内部的程序行都属于多行注释的一部分注释行的每行都以一个星号开头。
二、注释界定符不能嵌套
我们通常需要在调试期间注释掉一些代码。由于这些代码可能包含界定符对形式的注释因此可能导致注释嵌套错误因此最好的方式是用单行注释方式注释掉代码段的每一行。
1.4 控制流
1.4.1 while语句
// while语句反复执行一段代码直至给定条件为假为止
// 求1到10这10个数之和
#include iostreamint main()
{int sum 0, val 1;while (val 10) {sum val;val;}std::cout Sum of 1 to 10 inclusive is sum std::endl;return 0;
}1.4.2 for语句
#include iostreamint main()
{int sum 0;// 每个for语句都包含两部分循环头和循环体// 循环头控制循环体的执行次数它由三部分组成初始化语句、循环条件、表达式for (int val 1; val 10; val) {sum val;}std::cout Sum of 1 to 10 inclusive is sum std::endl;return 0;
}练习
for循环与while循环对比 在循环次数已知的情况下for循环的形式更为简洁。 在循环次数无法预知时用while循环实现更适合。用特定条件控制循环是否执行循环体中执行的语句可能导致循环判定条件发生变化。
1.4.3 读取数量不定的输入数据
#include iostreamint main()
{int sum 0, value 0;// while循环条件实际上检测的是std::cin// 当我们使用一个istream对象作为条件时其效果是检测流的状态。// 如果流是有效的即流未遇到错误那么检测成功// 当遇到文件结束符或遇到一个无效输入时例如读入的值不是一个整数istream对象的状态变为无效。处于无效状态的istream对象会使条件变为假while (std::cin value) {sum value;}std::cout Sum is sum std::endl;return 0;
}当从键盘向程序输入数据时对于如何指出文件结束不同操作系统有不同的约定。在Windows系统中输入文件结束符的方法是敲CtrlZ然后按Enter或Return键。在UNIX系统中包括Mac OS X系统中文件结束符输入时用CtrlD。
1.4.4 if语句
#include iostreamint main()
{int currVal 0, val 0;if (std::cin currVal) {int cnt 1;while (std::cin val) {if (val currVal) {cnt;} else {std::cout currVal occurs cnt times std::endl;currVal val;cnt 1;}}std::cout currVal occurs cnt times std::endl;}return 0;
}1.5 类简介
头文件后缀.h、.H、.hpp、.hxx。标准库头文件不带后缀。
1.5.1 Sales_item类
类Sales_item的作者定义了类对象可以执行的所有动作。
一、读写Sales_item
#include iostream
#include Sales_item.h
// 用尖括号()包围标准库头文件用双引号()包围不属于标准库的头文件int main()
{Sales_item book;std::cin book;std::cout book std::endl;return 0;
}二、Sales_item对象的加法
#include iostream
#include Sales_item.hint main()
{Sales_item item1, item2;std::cin item1 item2;std::cout item1 item2 std::endl;return 0;
}使用文件重定向允许我们将标准输入和标准输出与命名文件关联起来
$ addItems infile outfile
假定$是操作系统提示符我们的加法程序已经编译为名为addItems.exe的可执行文件则上述命令会从一个名为infile的文件读取销售记录并将输出结果写入到一个名为outfile的文件中两个文件都位于当前目录1.5.2 初识成员函数
#include iostream
#include Sales_item.hint main()
{Sales_item item1, item2;std::cin item1 item2;if (item1.isbn() item2.isbn()) {std::cout item1 item2 std::endl;return 0; // 表示成功} else {std::cerr Data must refer to same ISBN std::endl;return -1; // 表示失败}
}一、什么是成员函数
成员函数是定义为类的一部分的函数有时也被称为方法。
1.6 书店程序
#include iostream
#include Sales_item.hint main()
{Sales_item total;if (std::cin total) {Sales_item trans;while (std::cin trans) {if (total.isbn() trans.isbn()) {total trans;} else {std::cout total std::endl;total trans;}}std::cout total std::endl;} else {std::cerr No data?! std::endl;return -1;}return 0;
}小结
本章介绍了足够多的C语言的知识以使你能够编译、运行简单的C程序。我们看到了如何定义一个main函数它是操作系统执行你的程序的调用入口。我们还看到了如何定义变量如何进行输入输出以及编写if、for和while语句。本章最后介绍了C中最基本的特性——类。在本章中我们看到了对于其他人定义的一个类我们应该如何创建、使用其对象。在后续章节中我们将介绍如何定义自己的类。
术语
1、缓冲区一个存储区域用于保存数据。IO设施通常将输入或输出数据保存在一个缓冲区中读写缓冲区的动作与程序中的动作是无关的。我们可以显示地刷新输出缓冲以便强制将缓冲区中的数据写入输出设备。默认情况下读cin会刷新cout程序非正常终止时也会刷新cout。 2、表达式最小的计算单元。表达式求值会产生一个结果。 3、操纵符对象如std::endl在读写流的时候用来“操纵”流本身。