返回信息流☆─────────────────────────────────────☆
flyingroc88 (☆云中鹏☆) 于 (Thu Jun 7 09:51:42 2012) 提到:
最近看一本关于C的书,其中有一个关于a+++++b这个表达式的理解,不过不是很懂,求指导。书中解释如下:
应该理解成a++ ++ +b还是a++ + ++b,还是a + ++ ++b呢?应该按第一种方式理解。编译的过程分为词法解析和语法解析两个阶段,在词法解析阶段,编译器总是从前到后找最长的合法Token。把这个表
达式从前到后解析,变量名a是一个Token,a后面有两个以上的+号,在C语言中一个+号
是合法的Token(可以是加法运算符或正号),两个+号也是合法的Token(可以是自增
运算符),根据最长匹配原则,编译器绝不会止步于一个+号,而一定会把两个+号当作
一个Token。再往后解析仍然有两个以上的+号,所以又是一个++运算符。再往后解析只
剩一个+号了,是加法运算符。再往后解析是变量名b。词法解析之后进入下一阶段语法
解析,a是一个表达式,表达式++还是表达式,表达式再++还是表达式,表达式再+b还
是表达式,语法上没有问题。最后编译器会做一些基本的语义分析,这时就有问题了,
++运算符要求操作数能做左值,a能做左值所以a++没问题,但表达式a++的值只能做右
值,不能再++了,所以最终编译器会报错。
对斜线的部分不懂,++运算符要求操作数能做左值??表达式a++的值只能做右
值,不能再++??希望高人指导一下!
☆─────────────────────────────────────☆
shenlei (我爱果子|[路]|[天山南北]) 于 (Thu Jun 7 09:55:33 2012) 提到:
a++返回的是右值,不能再++了...
☆─────────────────────────────────────☆
sagi (开始走成熟路线) 于 (Thu Jun 7 10:11:55 2012) 提到:
扔掉这本书吧
☆─────────────────────────────────────☆
b78859793 (lcywawa之父) 于 (Thu Jun 7 10:44:25 2012) 提到:
同2楼 扔掉这本书吧
☆─────────────────────────────────────☆
miniful (A.I.O) 于 (Thu Jun 7 10:47:21 2012) 提到:
换下形式就明白了
a++ 等同于 a=a+1 // OK
a++ ++ 等同于 a=a+1=(a+1)+1 // NG
☆─────────────────────────────────────☆
wudilongfx1 (聚变) 于 (Thu Jun 7 11:07:21 2012) 提到:
这种sb书,赶紧扔掉
☆─────────────────────────────────────☆
astrophile (候鸟) 于 (Thu Jun 7 11:47:25 2012) 提到:
《Linux C编程一站式学习》,好书别扔
☆─────────────────────────────────────☆
purevirtual (杨无敌|SSE|本命年) 于 (Thu Jun 7 11:55:46 2012) 提到:
哈哈 c traps and pitfalls
x++ 左边要求是左值,这必须的
x++的返回是一个临时数值,如果你用C++自己写过a++ ++a的实现就明白了
☆─────────────────────────────────────☆
Forest0579 (【意涵团】I am a free bitch.) 于 (Thu Jun 7 14:00:55 2012) 提到:
遇到这种题 我一般都打不上来 然后默默的说这个和编译器实现和语言有关系。。。
☆─────────────────────────────────────☆
flyingroc88 (☆云中鹏☆) 于 (Thu Jun 7 16:34:42 2012) 提到:
【 在 astrophile 的大作中提到: 】
就是这本书
☆─────────────────────────────────────☆
waterwawa (waterwawa) 于 (Thu Jun 7 17:25:48 2012) 提到:
贪婪分析?
☆─────────────────────────────────────☆
dfxyz (DF_XYZ) 于 (Thu Jun 7 18:52:53 2012) 提到:
没这段内容吧……
☆─────────────────────────────────────☆
forgetall (forgetall) 于 (Thu Jun 7 19:40:47 2012) 提到:
即使 分析的再头头是道
但是如果你以后项目里经常写这种烂逼代码
那么你离开除不远了
写代码永远以可维护 让别人易看懂为准则 所以要么扔掉那本书 要么忽略那段话
☆─────────────────────────────────────☆
xiangziwade (wade) 于 (Thu Jun 7 20:07:41 2012) 提到:
[em68]
【 在 sagi 的大作中提到: 】
☆─────────────────────────────────────☆
wks (cloverprince) 于 (Thu Jun 7 20:11:42 2012) 提到:
bjarne叔叔再一次表示很无奈。真的别纠结这个问题了。再贴过来:
http://www2.research.att.com/~bs/bs_faq2.html#evaluation-order
What's the value of i++ + i++?
It's undefined. Basically, in C and C++, if you read a variable twice in an expression where you also write it, the result is undefined. Don't do that. Another example is:
v[i] = i++;
Related example:
f(v[i],i++);
Here, the result is undefined because the order of evaluation of function arguments are undefined.
Having the order of evaluation undefined is claimed to yield better performing code. Compilers could warn about such examples, which are typically subtle bugs (or potential subtle bugs). I'm disappointed that after decades, most compilers still don't warn, leaving that job to specialized, separate, and underused tools.
☆─────────────────────────────────────☆
iFadeToBlack (烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫*&^) 于 (Thu Jun 7 21:19:42 2012) 提到:
所以要fp
看见这种问题真蛋疼
iPhone客户端1.1发布
☆─────────────────────────────────────☆
Wizmann (Wizmann) 于 (Thu Jun 7 23:20:57 2012) 提到:
有人敢这么写程序我一键盘在他脸上拍出一“FXCK”。。。
☆─────────────────────────────────────☆
bluesea147 (蓝色的大海) 于 (Thu Jun 7 23:52:11 2012) 提到:
少年,放开那个a++++++b!
哈哈
那书里面说了很多底层的知识,讲的也很好,不过这个问题……略疼~~
☆─────────────────────────────────────☆
iFadeToBlack (烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫*&^) 于 (Fri Jun 8 22:41:45 2012) 提到:
今天跟别人讨论了一下,在写代码的时候注意不要写有副作用(包括修改引藏状态)的代码很重要,能显著提高代码的可用性和可测性。尤其是类成员函数没事就别改内部状态,不对外开放的接口就传参数吧。
当然,不这么做的前提是:一类很小,二代码很简单。
☆─────────────────────────────────────☆
Milrivel (Imoutolized) 于 (Sun Jun 10 22:15:46 2012) 提到:
当年的入门书。。。至少体系还是挺新颖的
和谭浩强还是有区别的
☆─────────────────────────────────────☆
gsl2011 (longGG) 于 (Fri Jun 15 21:38:09 2012) 提到:
前置:
int& int::operator()
{
*this+=1;
return *this;
}
后置:
const int int::operator(int)
{
int oldValue=*this;
++(*this);
return oldValue;
}
故a++返回const int ,是一个r-value,所以报错。
这是一条镜像帖。来源:北邮人论坛 / cpp / #64079同步于 2012/7/21
CPP机器人发帖
[合集] a+++++b这个表达式如何理解?编译器会报错
gsl2011
2012/7/21镜像同步0 回复
订阅后,新回复会通过你的通知中心匿名送达。
0 条回复
暂无回复 · 你可以订阅本帖等待新回复。