admin
管理员
管理员
  • UID1
  • 注册日期2011-05-18
  • 最后登录2022-08-22
  • 粉丝94
  • 关注0
  • 发帖数1061
  • QQ
  • 铜币1232枚
  • 威望8点
  • 银元1218个
阅读:5292回复:18

C++ 入门教程 转自 “杰物”

楼主#
更多 发布于:2011-12-23 21:18

首先,这是一份关于C++的入门教程,不会讲特别深的东西,一般的人应该都能听懂。
在你看到这个贴子的时候,不管你有没有学过其他语言,是为什么学这个,是男是女还是人妖,年龄多少,已婚未婚……你就应该忘掉以前的一切,把自己当做一个小学一年级的学生。
好,不废话了,开始。
咦,有问题了。杰物你总说神马C++的,那些代码怎么弄成程序啊?
额……这个可以去看置顶贴,弄一个IDE吧。
(半小时后……)
好了,打开吧。新建一个C++项目,或者源文件,然后添加如下的代码:
#include <iostream>
int main(void)
{
   std::cout << "I'm f**king C++!" << std::endl;
   return 0;
}
用复制-粘贴的方式放到你的IDE里。
然后选择编译(或者生成解决方案),然后运行。你会看到在一个黑漆漆的像DOS一样的窗口里,有这样一行文字:
I'm f**king C++!
这样表示你成功了!至于那单词中间为什么要有星号,不是我们讨论的问题……
神马?根本没有什么输出结果,只看到一个黑窗口一闪而过?哦,请在"return 0;"前面加上一行"std::cin.get();",这样程序就会停在那里,然后按一下回车就结束了。(用"system("pause");" 也行,只不过Linux下貌似没有这个命令。
好了,咱们的第一个C++程序大功告成了。不过运行倒是能运行了,可是这一堆乱七八糟的符号和英文单词神马意思啊,怎么用啊?别急,下层楼告诉你。
哎...今天够累的,签到来了3...
admin
管理员
管理员
  • UID1
  • 注册日期2011-05-18
  • 最后登录2022-08-22
  • 粉丝94
  • 关注0
  • 发帖数1061
  • QQ
  • 铜币1232枚
  • 威望8点
  • 银元1218个
沙发#
发布于:2011-12-23 21:19
#include <iostream>

int main(void)
{
   std::cout << "I'm f**king C++!" << std::endl;
   std::cin.get();
   return 0;
}

第一行严格意义上来说,并不是一个语句。因为这个指令的效果只是编译器编译的时候把编译器目录下的Include子目录里的"iostream"文件复制到这个位置来了。它是给编译器看的,不是运行时的。至于这个文件到底能干什么,我们以后还会慢慢说到。我们来分析下这个文件的名字,"io"相信很多人都能明白,就是"input/output"的缩写。然后这个"stream"是"流、小溪"的意思,所以我们称它为"io流"。

第二行是一个空格,去掉它严重影响了程序的外观,虽然在编译器眼里看来它什么都不是。

第三行是我们的代码咯。"int main(void)"这个得好好说说,这一行包括后面的两个大括号,我们称作一个函数。这个函数可不是y=3x这样的函数,而是在程序中实现一些功能的代码块。括号中间的代码就是这个函数的主要部分,完成功能的代码。前面的"int"表示这个函数的返回值(其实我觉得把"返回"二字去掉也无妨)的类型是int,也就是整数(Integer)。"main"是这个函数的名字,以后你定义的函数想叫什么就叫什么,只要是由数字字母下划线这三种ASCII字符构成的,而且以字母或下划线开头,且不重名就行。编译器可不会管你的函数名叫s**t还是叫bi**h(自己把星号内部替换成正确的字母)。函数名后面还有一对小括号"()",中间有一个"void"。这表示什么意思呢?函数名后面的括号是每个函数必备的东西,表示这个函数的参数表,你应该能明白"参数"的意思吧——就是需要的变量,不明白也没关系。void表示空,也就是没参数。当然,main有两种标准形式:
int main(void)
int main(int argc, char** argv)
至于后面一种什么意思,和第一种有什么区别, 日 后再谈。

第四行和第八行的大括号表示main函数定义的开始和结束,不再多说。

第五行的"std::cout << "I'm f**king C++!" << std::endl;"是整个程序中实现功能的关键部分。功能就是输出这句话,后面的"std::endl;"表示换行。当然,引号内的字符串(字符串是什么?你就当做是一堆字符吧)可以随便改,你把"C++"改成"杰物"我也不会知道。"<<"这个符号可以随便跟,比如:
std::cout << "I'm f**king" << "a" << "and b" << std::endl;
就相当于把它们连在了一起。不过注意是英文的双引号。
std::cout是什么意思?哎呀,说了你也不明白,就是一个ostream对象(果然不明白),记住cout后面跟要输出的东西就行了。

第六行可以不要的,只是为了便于我们"偷窥"输出结果。这句的实际意义是,接受一个字符输入(怎么输入?调到黑窗口,键盘输入好了再按回车呗)。但我们并不对这个输入的字符进行任何处理,所以利用它作为使程序暂停的工具。按了回车后这个函数的调用就结束了,程序就自己完成了。

第七行表示这个函数的返回值是0(同样,去掉"返回"也无妨),操作系统规定的意思是程序运行成功。
哎...今天够累的,签到来了3...
admin
管理员
管理员
  • UID1
  • 注册日期2011-05-18
  • 最后登录2022-08-22
  • 粉丝94
  • 关注0
  • 发帖数1061
  • QQ
  • 铜币1232枚
  • 威望8点
  • 银元1218个
板凳#
发布于:2011-12-23 21:19
看到这里你肯定还是挺迷糊的:为什么那个函数名字要叫"main"啊,而且我把代码写在外面不行?为什么后面还要return?别急,我来回答你。
1.名字叫"main"是革命需要,标准规定,你要是改个名字人家编译器不认你。
2.C/C++的实现功能的代码都是写在函数里的(后面的类、函数定义和全局变量定义不用写里面)。系统在运行这个函数的时候,从main开始执行,main函数执行完了程序也就结束了。所以就算是再大的软件,只要是由C或者C++写的,都会有main函数(WinMain?其实运行的时候还是得从main开始)
3.return 0、main的返回值和参数,这些都是标准规定。

可能细心的你注意到了,main里面那3行代码末尾都有一个英文分号";"。嗯,每个C++语句(不是语句的就不算)都是由分号结束的。空格和换行什么的可以去掉,编译器不挑剔。但是代码很多时候是给人(包括你自己。神马,你不是人?)看的,所以必须注意代码的美观整洁。由于C的这个特点,还专门有一个叫做IOCCC的比赛,比哪个的程序写得臭。你去?你现在还没那么"垃圾"的水平!

给你讲个小秘密,别人我不告诉他。
在main的定义前加上一行代码"using namespace std;",后面的"std::"都可以省掉了,即
cout << "I'm f**king C++!" << endl;
cin.get();
爽吧!不过这个到底有什么玄机,为什么可以这样?嘿嘿,嘿嘿……
哎...今天够累的,签到来了3...
admin
管理员
管理员
  • UID1
  • 注册日期2011-05-18
  • 最后登录2022-08-22
  • 粉丝94
  • 关注0
  • 发帖数1061
  • QQ
  • 铜币1232枚
  • 威望8点
  • 银元1218个
地板#
发布于:2011-12-23 21:20
作业:把你看不惯的人、想说的话,全部用你的程序发泄吧,嘿嘿。
哎...今天够累的,签到来了3...
admin
管理员
管理员
  • UID1
  • 注册日期2011-05-18
  • 最后登录2022-08-22
  • 粉丝94
  • 关注0
  • 发帖数1061
  • QQ
  • 铜币1232枚
  • 威望8点
  • 银元1218个
4楼#
发布于:2011-12-23 21:20
Q:我老把"<<"写成">>"怎么办?
A:你把那句话想象成一盆H2O,cout想象成显示器,那H2O就和它后面的液体,按顺序"流向"显示器了,所以这也是"stream"得名的原因。
哎...今天够累的,签到来了3...
admin
管理员
管理员
  • UID1
  • 注册日期2011-05-18
  • 最后登录2022-08-22
  • 粉丝94
  • 关注0
  • 发帖数1061
  • QQ
  • 铜币1232枚
  • 威望8点
  • 银元1218个
5楼#
发布于:2011-12-23 21:20
看完上面我又臭又长的叙述之后,你会在程序里把你讨厌的人都f**k了吧。不过今天我们这个程序要实现更高级的功能。请看:
#include <iostream>
using namespace std; //前面讲的,嘿嘿

int main(void)
{
   int age;
   cin >> age;
   cout << "You are " << age << " years old." << endl;
   cin.get(); //这句是为了避免一闪而过,VC用户可以无视
   return 0;
}
好了,编译,运行。咦?怎么一个字也没有,停着不动啊。别急,你输入个"13"(不包括这个引号),再按回车。哈哈,它神奇的输出了"You are 13 years old."。

这段代码惟一让你有疑惑的就是第六行和第七行。我们把第六行这种语句叫做“定义变量”,当然很多人也习惯叫它“声明”,不过为了与后面的“声明”区别开来,我还是统一叫它为“定义”。这句话用自然语言表述就是定义了一个变量,名字叫age(这单词你不认识?Google一下!),类型为int(Integer,整数,不过你要是写Integer编译器可不认识)。什么是变量?就是你内存里的一块空间,在你这个程序运行的时候,你变量所对应的内存空间就是属于你的程序的。那电脑怎么知道哪块内存是属于你程序,哪块内存是属于你AV播放器的呢?这里要用到内存地址的概念,指针这一节的时候会详细说它。变量的名字可以随便取,和函数命名的规定一样,不过要注意不能和函数或其他变量重名。

那么,更为重要的是,我们为什么要写这样一句话?我们先对这个程序的功能作出分析:
1.能得到用户的一个输入,输入的值表示一个年龄。
2.能输出"You are xx years old."这句话,其中的"xx"表示程序用户输入的年龄。
别笑,很多大程序也是这样分析的。因为要接收用户的输入,而我们不知道这个值是多少,所以需要一个"可以变的量"嘛。这个变量的类型是整数,可以是负整数。当然,这个变量是有取值范围的,至于这个取值范围是多少,嘿嘿,你活不到那么大(其实是我忘了……)。当然,没人的岁数是负的。所以我们可以在"int"前面加上一个"unsigned",意思是"无符号整数",直接写"unsigned"也行,这种变量的最小可取值是0。

搞了半天弄清楚了这句变量定义的原因和作用。下面是一个特别猛的语句:"cin >> age;"。"cin"和"cout"长的很像,就是双胞胎,不过一个负责输出,一个负责输入。这句话的意思能明白吧,就是把用户在窗口上的输入的值给变量age。你可以理解成"用户倒的H2O通过各种线路流到了变量age里"。然后我们才知道了用户到底想说什么。是不是觉得很神奇!

还有放在语句后的"//",这后面的内容表示注释,是给人看的,不是给编译器看的。从一行的"//"开始一直到换行,都算作注释,在高亮的IDE里面会用特别的颜色(通常是绿色和蓝色)显示。

cout可以既输出变量的值,也可以输出字符串(一串字符)的值。也就是说它什么都能吃,你神马都能往这里面倒,什么硫酸啊、过氧化氢啊……它统统给你输出到那个黑框框里。当然,我觉得这样很蛋疼,你还可以这样写(仅供参考):
#include <cstdio>
using namespace std;

int main(void)
{
   int age;
   scanf("%d", &age);
   printf(""You are %d years old.\\n", age);
   return 0;
}
这样写很麻烦,但比较简洁。原理?我不告诉你,嘿嘿。
哎...今天够累的,签到来了3...
admin
管理员
管理员
  • UID1
  • 注册日期2011-05-18
  • 最后登录2022-08-22
  • 粉丝94
  • 关注0
  • 发帖数1061
  • QQ
  • 铜币1232枚
  • 威望8点
  • 银元1218个
6楼#
发布于:2011-12-23 21:20
- 19
我等平凡人是从Hello,world学起的,不是从神马基类派生类虚函数入门的,您好好看看标题吧。
哎...今天够累的,签到来了3...
admin
管理员
管理员
  • UID1
  • 注册日期2011-05-18
  • 最后登录2022-08-22
  • 粉丝94
  • 关注0
  • 发帖数1061
  • QQ
  • 铜币1232枚
  • 威望8点
  • 银元1218个
7楼#
发布于:2011-12-23 21:20
- 24
刚学的时候我一直年“靠特”,后来偶尔看到一个视频教程,念的是“sei ao te”
哎...今天够累的,签到来了3...
admin
管理员
管理员
  • UID1
  • 注册日期2011-05-18
  • 最后登录2022-08-22
  • 粉丝94
  • 关注0
  • 发帖数1061
  • QQ
  • 铜币1232枚
  • 威望8点
  • 银元1218个
8楼#
发布于:2011-12-23 21:21
当你写了许许多多的输入年龄或者体重输出句子,或者来骂人的程序之后,你是否觉得厌倦了呢?好吧,我们现在就只有int cout cin这3个主要的关键字,当然会倦。所以还是得好好学啊……

你肯定会想到,要是我输入的数不是整数,而是小数呢?比如我要计量的不是和我在一起的MM数,而是我的私房钱在银行存款的利率呢?别急,你能想到的,C++的设计者们也会想到。所以除了int类型之外,标准还定义了float和double这两种变量类型来表示小数。有神马区别?好好好,告诉你吧,这可是独家。
首先说在计算机中小数不叫小数,叫浮点数。在32位的系统上(这个不明白的自己Google下),一个int默认占4字节,float占用内存4字节,而double由于吃多了太胖,要占8字节的内存。由于计算机复杂的浮点数表示方式(这个要扯能扯几天几夜),浮点数的精度总会有或多或少的丢失,而由于double占空间多,所以和float相比也就精确得多。如果不是特别省内存的情况下,尽量用double,float在运算过程中会转换成double计算再转换回double,造成额外的运行时耗费。
不知道你听懂上面的话没?没听懂算了,只需要忘掉float吧,它不适合你。
#include <iostream>
using namespace std;

int main(void)
{
   double x;
   cin >> x; //cin也是啥都能吃
   cout << x * x << endl;
   return 0;
}
程序的意思显而易见,是求输入x的平方。同样你可以把这个乘号改成加、减、或除,注意C++中没有乘幂符号"^",怎么乘方以后再说。不过我也不会蛋疼到输出个x - x……于是到这里你可以用double或int结合cin、cout完成最最基本的带用户提示的小程序了。
最后给你个C++基本类型表,你可以结合使用。
int 整数 4字节
double 双精度浮点数 8字节
float 单精度浮点数 4字节
char 单个ascii字符(通俗点就是基本的英文键盘字符) 1字节
wchar_t 宽字符(可以装下一个汉字) 2字节
bool 布尔值(取值只能是true或者false,用法你懂的) 1字节

然后在前三种类型面前可以加unsigned表示,使其不能表示负数。
哎...今天够累的,签到来了3...
admin
管理员
管理员
  • UID1
  • 注册日期2011-05-18
  • 最后登录2022-08-22
  • 粉丝94
  • 关注0
  • 发帖数1061
  • QQ
  • 铜币1232枚
  • 威望8点
  • 银元1218个
9楼#
发布于:2011-12-23 21:21
在尝试了很多很多种变量的组合和大量的输入输出后,你还是会觉得乏味。
当然,为什么程序只能一条路走到黑啊?不会变通吗?我告诉你,可以!
#include <iostream>
using namespace std

int main(void)
{
   unsigned weight; //为什么是unsigned?难道你体重是负的?
   cin >> weight;
   if (weight > 80) {
   cout << "Fat man!" << endl;
   } else {
   cout << "Just so so!" << endl;
   }
   return 0;
}
首先你把这个程序复制粘贴到你的IDE里,然后编译。咦?这次怎么没以前顺利了?我的VC2008是这样提示的:

错误 1 error C2144: 语法错误 : “int”的前面应有“;” d:\\my documents\\visual studio 2008\\projects\\cplusplus\\test\\test\\main.cpp 4

杰物,你TM傻x啊,给老子错的程序,肯定有人心里会这样想。不过编译器都仁至义尽了,该你自己解决了。人家说"int"前面缺分号,你就加上一个呗。
;int main(void)
不过这样怎么看怎么别扭,还是移到"std"后面去吧。嗯,世界清净了,程序运行了。你输入90,就说你是胖子,你输入50,就说你Just so so。不错,不错。
关于if和else……我开讲语法了。
if判断语句的格式是
if (condition) {
   // 当满足condition时执行的语句
} else {
   // 当不满足condition时执行的语句
}
当然,如果看不惯,大可不必像我这样。你同样可以
if(conditon)
{
//语句
}
else
{//语句
}
代码写得如何,那是你的自由。写得太烂被人骂,同样是你的自由。我无权干涉。
当if或者else里的语句只有一条的时候,可以不写大括号。当然,我习惯一直写,而且是这样写。
如果要满足多种情况判断的时候,还可以有else if子句。
if (condition1) {
   // 语句1
} else if (condition2) { // 注意不要发生逻辑错误
   // 语句2
} else {
   // 语句3
}
基本语法说的就这么多…不过有一个很重要的问题,也是许多熟悉C/C++的程序员常犯的错误,那就是"Hanging else"(悬挂的else)。这是神马?有代码,有真相。
if (age < 30)
   if (weight > 75)
   // xxx
else
   // xxx
把这段代码按照这样的缩进格式按自己的喜好补充,注意xxx那里只能填一行代码,因为没有大括号。你会发现这个程序的运行结果并不如你所料——其实else是和第2个if配对的!编译器只会让else和最近的if配对。要避免这种情况的发生,就是统统写大括号。
if (age < 30) {
   if (weight > 75) {
   // xxx
   }
} else {
   // xxx
}
这样就好了嘛。

最后补一句忘了说的话。C++可是区分大小写的,你定义了变量age,它可不认识Age!
哎...今天够累的,签到来了3...
admin
管理员
管理员
  • UID1
  • 注册日期2011-05-18
  • 最后登录2022-08-22
  • 粉丝94
  • 关注0
  • 发帖数1061
  • QQ
  • 铜币1232枚
  • 威望8点
  • 银元1218个
10楼#
发布于:2011-12-23 21:22
注意,百度会吃掉4空格以上的缩进,所以我的缩进要是被吃了,你懂的。当然,你也可以根据自己的喜好弄2空格缩进或者Tab缩进。
哎...今天够累的,签到来了3...
admin
管理员
管理员
  • UID1
  • 注册日期2011-05-18
  • 最后登录2022-08-22
  • 粉丝94
  • 关注0
  • 发帖数1061
  • QQ
  • 铜币1232枚
  • 威望8点
  • 银元1218个
11楼#
发布于:2011-12-23 21:23
- 30
1.考虑过这个,不过此“关键字”不是C++标准概念中的“关键字”。
2.sorry,这个我没有自己试。
3.我当时觉得没必要,说到字符串的时候再来提吧。
哎...今天够累的,签到来了3...
二维体
1级·灵魂力量
1级·灵魂力量
  • UID20078
  • 注册日期2011-12-18
  • 最后登录2011-12-28
  • 粉丝1
  • 关注0
  • 发帖数15
  • QQ
  • 铜币0枚
  • 威望0点
  • 银元3个
12楼#
发布于:2011-12-23 23:03
安装程序都没教就开始教教程了啊
沉沦寒风
  • UID20915
  • 注册日期2012-03-14
  • 最后登录2012-03-23
  • 粉丝0
  • 关注0
  • 发帖数12
  • QQ
  • 铜币15枚
  • 威望0点
  • 银元43个
13楼#
发布于:2012-03-14 23:24
{:soso_e179:}
lixhz
1级·灵魂力量
1级·灵魂力量
  • UID29980
  • 注册日期2013-01-04
  • 最后登录2013-01-16
  • 粉丝2
  • 关注0
  • 发帖数21
  • QQ
  • 铜币2枚
  • 威望0点
  • 银元22个
14楼#
发布于:2013-01-06 16:50
楼上的稍等啦
上一页
游客

返回顶部