贴吧上的文

首先,这是一份关于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++程序大功告成了。不过运行倒是能运行了,可是这一堆乱七八糟的符号和英文单词神马意思啊,怎么用啊?别急,下层楼告诉你。








#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(同样,去掉"返回"也无妨),操作系统规定的意思是程序运行成功。












看到这里你肯定还是挺迷糊的:为什么那个函数名字要叫"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();
爽吧!不过这个到底有什么玄机,为什么可以这样?嘿嘿,嘿嘿……












Q:我老把"<<"写成">>"怎么办?
A:你把那句话想象成一盆H2O,cout想象成显示器,那H2O就和它后面的液体,按顺序"流向"显示器了,所以这也是"stream"得名的原因。








调个骨头:“WinMain?其实运行的时候还是得从main开始”
WinMain可不是由main调用的,两者都是由__tmainCRTStartup调用的










看完上面我又臭又长的叙述之后,你会在程序里把你讨厌的人都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;
}
这样写很麻烦,但比较简洁。原理?我不告诉你,嘿嘿。














当你写了许许多多的输入年龄或者体重输出句子,或者来骂人的程序之后,你是否觉得厌倦了呢?好吧,我们现在就只有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表示,使其不能表示负数。










“关键字”这个词还是。。。
warning C4076: “unsigned”: 不能和“float”类型一起使用
LS是不是笔误了?重要的unsigned char反而没说




1.考虑过这个,不过此“关键字”不是C++标准概念中的“关键字”。
2.sorry,这个我没有自己试。
3.我当时觉得没必要,说到字符串的时候再来提吧。












在尝试了很多很多种变量的组合和大量的输入输出后,你还是会觉得乏味。
当然,为什么程序只能一条路走到黑啊?不会变通吗?我告诉你,可以!
#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!








注意,百度会吃掉4空格以上的缩进,所以我的缩进要是被吃了,你懂的。当然,你也可以根据自己的喜好弄2空格缩进或者Tab缩进。










int main(void);//←ISO C99的标准形式之一。
int main();//←ISO C++03的标准形式之一。
尽管两者在C++中相同(在C中略有不同),既然提到“标准”,那么还是遵照原文比较好一点。
细节漏太多了吧。
ASCII字符是7位。char是8位。
另外char、signed char、unsigned char是三种不同的类型。后两者最好当作纯粹的算术类型来用。
还有wchar_t……(暂时不管char8_t、char16_t、char32_t之类的……)
char是std::numeric_limits<char>::digits+static_cast<std::size_t>(std::numeric_limits<char>::is_signed())位。(兼容的C实现中是CHAR_BIT宏定义的值,这个位数至少是8)。
当然一般实现中是8位。












为了表示我还活着,所以发一个……
当你想输出1-100的所有整数时,你会怎么做?


#include <iostream>
using namespace std;


int main(void)
{
   cout << 1 << endl;
   //中间省略98行
   cout << 100 << endl;
   return 0;
}


这样倒是可以有效地增大代码的体积,使你看起来更“专业”,不过这实际上是一种浪费时间和精力的愚蠢行为!看看真正的高手是怎么做的吧。


//省略那两行,你懂的。
int main(void)
{
   int i = 1;
   while (i <= 100) {
   cout << i++ << endl;
   }
   return 0;
}


漂亮,4行就解决了问题,完成了100行做到的任务!聪明的你注意到了这里似乎又有了新东西——那是当然,否则我也不会发贴了。"int i;"对于你来说已经很熟悉了吧。什么,不知道?面壁思过去!注意后面的" = 1",这表示在定义变量i的时候同时给它一个初始值1,这叫做变量的初始化。提醒一下,如果写成"int i; i = 1;",这样效率是比不上前面的那一种的。原因?讲起来就复杂咯……另外,这个变量的初始化还有一种等价的写法"int i(1);",这种看起来更professional吧?哈哈。至于为什么可以这样写,那是类和对象的知识了,所以再说就偏题了,以后再分解分解吧。


又到了下一行,你看到了一个新的关键字——while。查查词典,这是个连词,意为"当……时"。后面的那个符号我们提到过,是"小于等于"的意思。相信你已经猜出了这行代码的大概意思了,就是"当i小于等于100时",那么这时我们要干什么呢?看下文。


有cout,所以肯定是输出。然后,这个i++就是它的精华。这个表达式的值是i,然后执行完这个语句后i的值自动加上1。而++i这个表达式的值则是加1后的i。还不理解?自己运行这段代码,你将得到答案。


#include <iostream>
using namespace std;


int main()
{
   int p = 0;
   cout << ++p << endl;
   cout << p << endl;
   return 0;
}


试着把第一个cout里的"++p"改成"p++",观察结果有什么不同。


对于输出1-100的那个程序,把while里的语句改成这样也可以。
while (i <= 100) {
   cout << i << endl;
   i++;
}
不过我觉得缺少了一种简洁美,你说呢?
另外,如果你还想好好活着体会生活的美丽的话,就不要去研究(i++)+(++i)+(i++)这样的表达式的值了——一是没明确定义,二是太蛋疼。
对于整段语句,你已经明白了,就是定义一个变量i,初始值为1,然后输出,加1,再检查i是否小于等于100,如果是,继续输出i,然后加1……直到i的值变为101,这真神奇。这就是传说中的——循环语句!在循环语句中需要注意的就是别死循环,死循环就是一直在那儿跑,永远达不到循环终止的条件。除非你结束程序,或者静候2012的到来……不过死循环还是没有以后我们会提到的死递归严重。毕竟,我们的操作系统就是个死循环。循环语句的格式并不只有while{}一种,还有do{} while和for(){},由于时间关系,我们以后再讲。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值