C++ main:处理命令行参数

继续学习C++,,,

给main函数传递实参例子,自己写了一个小程序来测试一下,如下图所示。

这样,当我用命令

g++ main_with_arg.cpp -o main_with_arg

编译,然后

./main_with_arg david -love i don\’t know

运行的时候,屏幕就会输出

说明第一个argc参数会记录传递给main的参数,然后第二个参数argv是一个字符串数组,会把每一个命令字符串都记录下来,当然,需要用到转义字符‘\’的时候还是要使用。

这里顺便测试了一下我的机器上,size_t的大小,看来跟int一样。

在这里填写标题

想不出来第一句话该怎么写,腰疼。

 

好像已经很久没坐下来记录一下心情了,也不是没有时间,研究生最多的就是时间,我是指我这样闲的研究生,刻苦专研的请原谅我把你们一起黑了,天朝V5。

 

觉得以前的自己是个过度思考者。通常来说,思考总是好的,但考虑得太多,做什么事总想等待完美,等着完美的时机,完美的气氛,完美的条件,把一些早该做的事情一拖再拖,拖到自己也觉得疲惫,往往结果也不那么尽善尽美。其实自然的开始,不断的改善就已经很好了。正好,今早赖床的时候把《沙哈拉的故事》看完了,明早又要逃离帝都回雾都,这个时候写一写三俗读后感也算是一种消遣,顺便把前面欠下的几个“读后感”一起打包嘎嘎。

 

抬头扫了一眼书架上的书,哇,原来这学期已经看了这么多勒,果然很闲。除了一直放在床头催眠用的《大学·中庸》,前后应该是看完了《林徽因传》《who moved my cheese》《北京法源寺》《追风筝的人》还有刚看完的《沙哈拉的故事》,除了《林徽因传》已经写了点东西外,其他的书好像看完就看完了,也没有留下什么可供自己日后嘲讽的——那正是现在在做的事,不再无谓等待。

 

先说说《沙哈拉的故事》吧。看完《追风筝的人》以后,同学推荐了一本外文的小说《Animal Farm》,因为拖拖拖,才看了一些网上的简介和评论,还没有去买实体书的时候另一位同学送了一本《沙哈拉的故事》,就先看这本了。讲的是三毛与荷西在沙哈拉沙漠与一群人的故事。

 

好了,再说说上一本,《追风筝的人》吧。对滴,《沙哈拉的故事》读后感已经写完啦。

 

算了,好像过于不负责任,以后吐槽自己也找不到吐槽点啊。其实读完《沙》,给我最大的感触是三毛对生活的热爱!沙哈拉威人完全不属于想象中“土著人”的那种纯朴的人,至少从三毛描述的来看是这样的。我想,大概是天使沙伊达的悲惨遭遇让她其实是怨着沙哈拉威人吧。一个让女人都看得出神的女人,到底该是怎样的呢,而且还很不现实的拥有着圣洁的灵魂,只是这种愈完美,当她跌落的时候,冲击也愈大吧。当她写这本书的时候,回想起这些事情,难免就把沙哈拉威人描写的非纯朴一些了,至少,给我的感觉是这样。不过我经常理解错的,三毛勿怪,小的该死。

 

耶,换一本来说。该是《追风筝的人》了。看吧,这就是不及时写的坏处,现在都没太多的感觉了。当时大致觉得在主人公性格懦弱的一面,也找到了自己的影子,不敢站出来承担自己应该承担的责任,而恰恰自己最讨厌的就是不负责的人。也让我想起了小时候对弟弟妹妹们的亏欠,所以一直以来,都想弥补,尽量做一些能做的事,不称职的大哥啊,对自己说声呵呵算是暂时告一段落吧。

 

《北京法源寺》,第一次看李敖大师写的书,确实是大师,这是我依旧能记清楚的当时读这本书的感觉。虽然他狂——他确实有狂的资本,他傲——他有傲的实力。犀利的言辞倒不是这本书的最大亮点,但大量的资料信息、历史考证让我一面拼命吸收的同时也让我感觉手足无措——实在太多,根本接收不过来嘛。总的来说,这是一本历史小说。讲康有为、梁启超、谭嗣同他们的故事,当然这三人一起出现的时候,那么“大姨妈”西太后肯定是要出来插一脚的,而且是插了一大脚。哦对了,看了这本书才知道,原来西太后是光绪皇帝的大姨妈。。。这么有喜感的事儿,就以它来终结本书的读后感好了。噢,想起一件事,法源寺是有时间一定要去看一看的,看看那龟趺是否依然在这里承载着历史。

 

由于《林徽因传》已经写过一篇啦,那最后就剩下英文小说《who moved my choose》——谁动了我的奶酪。该书是很早很早以前写的了,主要是教导人们不要恪守一些已经无法改变的事情,当环境发生改变时,不要老想着以前如何如何,想方设法的想回到以前,而是要适应新的改变,积极努力去改变,说不定生活会更美好。也不说好,也不说不好(嘿,让我想到一个成语呢——不置可否,不知道是不是就是这个意思),总之我觉得还是不能太绝对,还是具体问题具体分析的好。

 

呼~,敲了这么久,终于要敲完了。最后奉上一张软微校区的照片吧,当然啦,只是一角而已。

 

 

软微,其实是一个漂亮的园子,只要你有心。

晚安。

2012.11.25 00:15:15 @ 软微

 

PS:祥辉一路顺风。

C++ 复合赋值操作符性能

继续学习C++。

看到+=, -=, *=, /=以及其他复合赋值操作符号的时候,虽然以前学C的时候老师就讲过:这种方式的速度比相应的 A = A + B, A = A * B要快,因为对于前一种方式,左操作数只取了一次。

这不,正好前几天用到了clock()这个函数,那写个demo来看看到底快多少,于是有了下图所示的代码。

用三个变量记录了一下从程序开始,到调用clock()时,这段期间的时钟周期数。

对于常量“CLOCKS_PER_SEC”则是指每一秒的时钟周期个数,POSIX系统一般都是1,000,000

程序对两种方法分别执行了20亿次的加法运算记时,结果如下图所示,直接打印的是时钟周期数,而不是秒,如果要得到秒,用这个数除以CLOCKS_PER_SEC即可。

从结果看出,两种方式,20亿次加法运算,时间都是4.9X秒,差别非常小。并且,有可能第一种方式快,有可能第二种方式快,平均下来1:1。也有可能是哪里疏忽了,导致结果不对。

单从这次结果来看,无甚差别。

 

goodbye.

C++ 变量作用域小探索

 

最近开始学习C++, 刚好看到作用域这一块儿,遇到一些好像跟C不一样的地方(或者是一样的,,只是以前没注意罢了),比如说定义嵌套覆盖。。

写了一个小例子

 

#include

int num1 = 1;
std::string str1 = "David";

//display the value of str1
void display();

int main()
{
std::cout << "before definiton in main, num1 is " << num1 << std::endl; int num1 = 2; std::cout << "after definition in main, num1 is " << num1 << std::endl; std::cout << "before definiton in main, str1 is " << str1 << std::endl; display(); int str1 = 3; std::cout << "after definition in main, str1 is " << str1 << std::endl; display(); int num2 = 4; std::cout << "first declaration in main, num2 is " << num2 << std::endl; //std::string num2 = "Daisy"; //compile error:conflicting declaration //int num2 = 5; //compile error:redeclaration //statement scope for(int num1 = 0, sum = 0; num1 < 1; num1++) { sum += num1; std::cout << "num1 is " << num1 << std::endl; } std::cout << "num1 is " << num1 << std::endl; //statement scope for(int num2 = 0, sum = 0; num2 < 2; num2++) { sum += num2; std::cout << "num2 is " << num2 << std::endl; } std::cout << "num2 is " << num2 << std::endl; //block scope { std::string str1 = "Daisy"; std::cout << str1 << std::endl; display(); } std::cout << str1 << std::endl; } void display() { std::cout << "in display() str1 is " << str1 << std::endl; }

 

 

然后输出结果是

 

1.首先对于num1这个变量,已经在第三行定义成了全局变量并初始化为1,然后在main函数里第11行,打印输出很显然就是

“before definiton in main, num1 is 1”

然后我们在第12行把它重新定义一下,赋值为2,在第13行里打印出的结果就是

"after definition in main, num1 is 2"

惊讶了一下,居然可以这样用(或许是我以前没有这么写过C吧,不知道在C里面是否也可以这样用,忘记测试了)。对于已经定义了的变量,再定义一次,难道不会引起重复定义错误吗??那编译器不会迷惑吗?但是结果很显然的摆在那里,没有错误,并且结果也是预想的结果。

我就在想,会不会是因为类型一样,所以编译器忽略这些什么的。。。然后就想了一个比较BT的招儿,那就是把类型也给他换了,只保证名字一样,看结果如何。这就出现了第二个测试点。

 

2.对于在第四行第一次定义的string变量 str1,赋值为“David”。在main函数里第15行打印一下,很显然结果是

"before definiton in main, str1 is David", 就如同结果图片里面的第三行输出。

接着我调用了一下display()函数,主要是打印一下str1这个全局变量,结果也很显然是

"in display() str1 is David"

好了,现在我在第17行,重新定义了一下str1,这次不止改变了值,连类型也改变了,把它定义为了int并赋值为3,而全局变量是string类型的。然后打印,编译器没有报错,正常打印。

“after definition in main, str1 is 3”,然后我又调用了一下displays()函数,想看看是不是全局变量的也改变了,打印结果是

"in display() str1 is David",说明全局变量并没有被改变!

 

通过第1和第2两点,我总结了一下。全局变量虽然它的作用域是全局,但是在函数里面可以被屏蔽(不知道该找什么形容词),也就是说如果函数里面没有重新定义这个全局变量,那么对该变量的使用跟正常使用变量没什么区别。但是如果在函数里面重新定义了该变量,不管类型是不是一样,那么在二次定义以后,该函数对其的使用则是使用其重新定义以后的变量,但是这种使用并不改变全局变量,只是全局变量暂时被屏蔽了而已。

 

然后我在想,是不是只有全局变量可以这样被二次定义,然后就做了第三个试验

3.在main函数里第21行,定义了一个int变量num2,赋值为4,然后打印一下。结果很显然是

"first declaration in main, num2 is 4"

接着我试着在后面重新定义一下num2,首先把它的类型改变,编译,果断报错,“冲突的定义”。

然后我在想,是不是太激进了,于是只改变其值,不改变类型,但是不是直接赋值,而是重新定义一下并赋值。如24行所示。编译,果断报错,“重复定义”。

通过测试点3,说明了在同一作用域里的变量是不能重复定义的,只能定义一次。这个倒很正常,,,,因为写C的时候,这些都很熟悉了,只是前面遇到了“屏蔽”的情况,所以想顺道测试一下是不是同一作用域下也能“屏蔽”。

既然做都做了,那么也顺便测试一下语句作用域的情况吧,不是还有个叫statement scope的作用域么,于是有了测试点4

4.首先在一个循环里面,重新定义一下num1,我想,既然可以从“外”往“里”屏蔽,那么从“里”往“里的里”也应该能屏蔽,果然,在for里面,num1的值是在语句作用域里的值,跳出循环以后,再打印就是函数作用域里的num1值了(不是全局的值,它已经被main里的屏蔽,这点从打印的是2 而不是 1就看得出来)

然后测试了一下num2,这个结果就很显然了,既然“外”到“里的里”都都能屏蔽,那么只过度了一层的“里”到“里的里”,显然也能成功,打印结果也显而易见。

接着很蛋疼的测试了一下,直接用花括号包含起来的块作用域(能不能这么称呼啊。。。),把str1重新定义为了“Daisy”,然后打印,结果是“Daisy”,说明屏蔽成功,然后调用display()函数,打印的是“in display() str1 is David”,说明全局变量并没有被改变,那么对于str1的重定义是改变的什么呢,我觉得就是改变的main函数里的str1啦,我们在main函数里把str1重新定义为了int类型,然后在这个块里面,我们又屏蔽了这个int的定义,然后用string重新定义了。但是出了这个块以后,回到了main函数作用域,那我们打印str1的时候,当然又回到了main函数作用域里对他的定义,那就是int类型,并且值为3.

 

好啦,总结完毕,也对作用域有了更一步理解,,,其实说得挺模糊的。。。嘎嘎。

 

 

ssh连接godaddy

在godaddy那里为网站添加了SSL,其实主要是买SSL它会送一个独立IP,共享IP太容易被封了(独立的貌似也挺容易。。)。添加以后发现ftp好像登录不上去了,于是想用SSH去访问,不然我咋传文件啊,去网站传太慢了。

在命令行输入命令以后,居然提示我

“This account is currently not available.”

google了一下,发现是没有开启SSH。于是跑去godaddy,登录自己的账户,在web hosting下有一个SSH,就在这里激活。

但是它需要给你的手机发一个PIN码,你输入手机号的时候,记得加86,代表天朝~

输入完以后,点激活,半分钟就会有一个电话打过来,告诉你3个数字,然后输入到相应位置,就OK啦。

号码好像是+0001901212

return -1 为何echo $? 是255

今天在看C++, 书上说在命令行输入 echo $? 可以访问main函数的返回值来查看系统状态。一般来说我们main不是返回0嘛,返回其他值就是告诉系统错误,返回就返回了,也没有去注意。

突然想看看return -1的时候系统状态值是不是真的-1,结果发现echo $?以后,显示的是255!不是-1!

上网google了一下,发现系统的状态值是0-255,然后,当然return -1 再echo $?的时候就是255啦,同理如果返回-2的话就是254啦。

算是一个小知识。。记录一下~~~~~~

 

 

 

 

Linux改变文件目录字符集编码

最近遇到一个问题,就是把文件从windows通过SSH上传到linux服务器以后,在web页面浏览这些文件的时候,中文出现乱码。

到处搜搜,解决了,记录一下,方便以后要用的时候好找。大致是因为windows使用的GBK来编码中文字符,而linux用的是utf-8吧,所以只要转换一下格式就行了,于是搜了一下命令。

命令格式:convmv -f [原始编码] -t [目标编码] -r(目录循环)  –notest(实际改变,否则只是测试) [操作路径、文件]

如: convmv -f GBK -t UTF-8 -r –notest  upnp-related/  将  当前目录/upnp-related/下所有的目录和文件名由GBK改为UTF8格式。

如下图所示

然后再在web页面访问的时候就不是乱码啦