加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

c语言中的空格到底有没有用?

(2011-11-18 10:56:23)
标签:

c语言

运算优先级

it

分类: c语言相关
空格在c语言里面是有用的!

举个例子:
int f = 5; int e = ++f+++f+++f+++f;
问 e 与 f 最后会是什么值。

先自己试试。



一般的答案是 31,原因是 VC 等编译器不是从右往左扫描计算,“++”比“+”有更高的优先级。这样:
^1 e = ++f + ++f + ++f + f; (f=6)
^2 e = ++f + ++f + f + f; (f=7)
^3 e = ++f + ++f + 14; 这里开始堆栈里面才有数据 (f=7)
^4 e = ++f + f + 14; (f=8)
^5 e = ++f + 22; (f=8)
^6 e = f + 22; (f=9)
^7 e = 31;

在我电脑上显示的是不通过的。程序如下:
#include <stdio.h>

int main (void)
{
int f,e;
f = 5;
//pass, good coding
e = (++f)+ (++f)+ (++f)+ (++f);
//pass, spaces work 
//e = ++f+ ++f+ ++f+ ++f;
//error: lvalue required as increment operand
//computer would see it as e=++f++ + f++ + f++ +f;
//e = ++f+++f+++f+++f;
 
//error: lvalue required as increment operand 
//e = ++f++;
printf("f=%d,e=%d\n",f,e);
return 0;
}


猜测这个表达式的求值取决于编译器如何解析这个字符串。因为这个字符串也可以被解释为
int e=++f++ + f++ + f++ +f;
,这个表达式就没法求值了。
Ansi C解释器应该采用所谓maximal munch strategy,就是字符串如果有多种成立的解释情况,则取能够构成最长字符串的一种。所以这个表达式会被解析成上面说的哪个不能求值的字符串,所以会报错。

写程序和出题的都很 O pain!

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有