关于a+++++b问题

int a=1,b=1; int c=a+++++b; printf("c=%d/n",c); 这段代码是无法通过编译的。 解释如下: 1、首先介绍一些基本的概念 1)、大嘴法,又称贪心法: 如果(编译器的)输入流截止至某个字符之前都已经被分解为一个个符号,那么下一个符号将包括从该字符起之后可能组成一个 符号的最长字符串。也就是说,每一个符号应该包含尽可能多的字符。换句话说,编译器将程序分解成符号的方法是,从左到右一个字符一个字符地读入 ,如果该字符可能组成一个符号,那么再读入下一个字符,判断已经读入的两个字符组成的字符串是否可能是一个符号的组成部分,如果能继续读入下一个字符,重复判断,直到读入的字符组成的字符串已不再可能组成一个有意义的符号。 举个例子,如a---b 与表达式a-- -b的含义相同,而与a- --b的含义不同。 再比如:b=a/*p /* p指向除数 */; 该语句的本意是用a除以p所指向的值,把所得的商再赋给b。而实际上,/*被编译器理解为一段注释的开始,编译器将不断地读入字符, 直到*/出现为止。因此要重写:b=a / *p /* p指向除数 */; 更清楚点就是b=a/(*p) /* p指向除数 */;此所谓二义性。 2)、左值和右值 左值就是在赋值中可以放在赋值操作符两边的值,比如: int a = 1; double b = 2.0 a = b; b = a; 这里a和b都是左值,一切变量都是左值,但const量是例外。 右值则是只可以放在赋值操作符右边的值,比如: int a = 0; char *b = "hello"; 3 = a; // ERROR "howdy" = b // ERROR 这里3和"howdy"都是右值,所以不能放在赋值操作符左边,一切常数、字符和字符串都是右值。 i 和 -i 都是表达式,但一个是左值(i),一个是右值(-i)。 ++,--这两种操作符要求作用于左值,所以i++合法,(-i)++不合法。 2、a+++++b的含义: 唯一有意义的解析方式是:a ++ + ++ b 可是,根据“大嘴法”规则,应该被分解为:a ++ ++ +b ,这个式子从语法上来讲是不正确的,它等价于:((a++)++) +b 但是,a++的结果是不能作为左值的,因此编译器不会接受a++作为后面的++运算符的操作数。这样,如果遵循了解析词法二义性问题的规则,上例的解析从语法上来说又没有意义。因此,在编程实践中,谨慎的做法就是尽量避免使用类似的结构,除非你非常清楚这些结构的含义。 参考: 1、《C陷阱和缺陷》 2、http://blog.csdn.net/lovewwy/archive/2009/02/26/3940670.aspx

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值