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!
前一篇:迅速理解GCC的工作原理

加载中…