昨天把GCC安装好了,写了个简单的文件test.cpp
<span style="font-size:14px;">int main(){
return 0;
}</span>
执行$gcc test.cpp,报了个错:
gcc: error trying to exec 'cclplus': execvp: No such file or directory
这意思是再次执行$gcc test.cpp,还是报了一个错:
(.eh_frame+0x11) undefined reference to "__gxx_personality_x0"
因为这里不该用gcc,用g++才对,什么原因呢,参考
这里。记得编译cpp文件用g++,gcc的通用参数也要记得:
流程:预处理-->编译-->汇编-->连接-->执行
-c 不连接
-S 只编译不汇编
-E 只是预处理
-o file 指定输出的文件名
-v 打印编译过程
1.2 初识输入输出
iostream库包含了两个类型istream和ostream,cin是istream的标准输入,标准输出ostream有三个分别是cout、cerr和clog,cout由于函数内部正常打印,那么cerr就是错误打印了,clog用于日记方便调试代码吧!
#include语句一般都放在函数外,并统计合并在文件的开始处,但我工作时真的看到过#include出现在文件中某个函数的内部,牛!不过还是统一风格更好,易读可维护。
std::out << "Enter two numbers" << std::endl;等价于(std::out << "Enter two numbers") << std::endl;,意味着是左运算,std::endl是操纵符,不表示换行,表示结束当前行,并且刷新缓冲区到设备,调试的时候只有不停的刷新缓冲区才能知道崩溃的及时位置。
std::out和std::in隐藏了数据类型,比C中的print灵活!
1.3 注释简介
修改代码时要同时修改注释,错误的注释比没注释更恐怖,有时看着代码和注释不一样挺困惑的,再忙也要保证注释和代码一致性。
单行注释//
界定符注释/* */,使用时养成在每行开始处添加*的习惯,因为这种风格比较容易辨认。注意不能嵌套,因为编译器在遇见/*后只负责找*/而/*会被忽略掉。另外调试的时候可能需要注释一些含界定符的代码,这是最好用//注释掉每一行,防止嵌套。
回忆一下别的语言的注释:html<!--><--> python""" """ php/* */ matlab%只能一行行的注释。
1.4 控制流
1.4.1 while语句
while(condition){statement}先判断条件再执行语句;
do{statement}while(condition)先执行一次再判断条件。
语句块任何时候都可以用,只要把代码块用{}括起来即可,比较少见。
练习1.9
#include <iostream>
int main(){
int nBegin=50, nEnd=100, nSum=0;
while(nBegin != nEnd)
{
nSum += nBegin;
++nBegin;
}
}
练习1.10
#include <iostream>
int main()
{
int cnt=10;
while(cnt-- >= 0) std::cout << cnt;
}
#include <iostream>
int main(){
std::out << "Enter two interger numbers:" << std::endl;
int nBegin=0, nEnd=0;
std::cin >> nBegin >> nEnd;
while(nBegin <= nEnd)
{
std::cout << nBegin;
++nBegin;
}
}
1.4.2 for语句
for(init; condition; expression){statement},init只在开始的时候执行一次,然后先判断条件在执行statement,最后执行表达式一个循环结束。注意中间是分号";",不是逗号","。
1.4.3 读取不定量的输入数据
while和std::cin配合使用,istream对象遇见异常或者end_of_file,std::cin为假,跳出循环。在界面中执行文件结束,window是CTRL+Z然后按Enter或Return,Mac Os或者Linux是Ctrl+D。
练习1.16
#include <iostream>
int main()
{
int sum=0, value=0;
while(std::cin >> value) sum += value;
std::cout << "Sum is :" << sum <<std::endl;
return 0;
}
编译错误具有马太效应,使用编辑-编译-调试(edit-compile-debug)模式,解决一条错误数条编译错误会跟着消失。
1.4.4 if语句
赋值运算符=和相等比较运算符==不能混淆。
#include <iostream>
int main(){
std::out << "Enter two interger numbers:" << std::endl;
int nBegin=0, nEnd=0;
std::cin >> nBegin >> nEnd;
if(nBegin > nEnd)
{
int change = nBegin;
nBegin = nEnd;
nEnd = change;
}
for( ; nBegin <= nEnd; ++nBegin)
std::cout << nBegin;
return 0;
}
再次强调风格的重要性,虽然风格各式各样,但养成自己的风格更重要。
#include <iostream>
int main(){
std::out << "Enter two interger numbers:" << std::endl;
int nBegin=0, nEnd=0;
std::cin >> nBegin >> nEnd;
if(nBegin > nEnd)
{
int change = nBegin;
nBegin = nEnd;
nEnd = change;
}
for( ; nBegin <= nEnd; ++nBegin)
std::cout << nBegin;
return 0;
}
1.5 类简介
类类型(class type)是C++最重要的特性之一,好像开始深入C++了!
类的定义放在头文件里,头文件一般以.h为后缀,但也有使用.H、.hpp或.hxx的程序员。标准头文件不带后缀,有些IDE对后缀有要求。
来之标准库的头文件用尖括号<>包围文件名,其余的用双引号""包围。
文件重定向功能$addItems <infile >outfile。执行addItems.exe时会读取当前目录下的infile文件作为输入,然后输出给outfile。
眼看这一章就要结束了,后面还有一个总结,很细致的把这章的术语又重新整理一遍,”虽然自己看不下去,但这种人性化很赞!!!