| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1335 人关注过本帖
标题:c=a*b+++b
只看楼主 加入收藏
doubleflygo
Rank: 2
等 级:论坛游民
帖 子:26
专家分:50
注 册:2010-1-22
收藏
得分:0 
#include "stdio.h"
void main()
{
    int a=3,b=5,c;
    //c=a*b+++b;//c=20=3*5+5,不论看成a*b,还是a*b++,这个短语的值都是15,这个是一定的;
                //而后面的有两种理解:1.+(++b),楼主的理解应该就是这种,
                //                      2.+b,此时a*b++就是一个短语了
    //其实我们可以用另外的例子来试验一下就行;c=3*5+++b;因为大家知道常量后面是跟‘++’没有意义;如果以楼主的理解的话,这条赋值语句
    //应该等价于第一种理解后的语句,而在我们实际编译的时候,是不能通过的,错误提示:‘++’needs L-value
    //也就是‘++’符号需要一个左变量,因此我们可以推测编译器在处理这种问题的时候都是“就前原则”--符合语法的条件下;
    //再深入一点,假设c=a*b++++b;编译一下出现:两个错误:
    //1."++" needs l-value  2.missing ';' before identifier'b'
    //我们可以根据提示的错误分析编译器的过程:
    //首先编译器的词法分析过程将表达式划分成'c','=','a','*','b','++','++','b';
    //语法分析的过程(也就是检错的过程):由其错误可知语法规则必规定'++'的'L-value'是一变量名;
    //而c=a*b++++b;这个表达式第一个'++'左边是变量名'b',符合规则;第二个'++'左边是'a*b++',不是一个变量名,则报错1;
    //而扫描到'b'时,提示错误2,个人得出两种可能:
    //第一种可能:在1错误解决的条件下,也就是假设‘c=a*b++++'是一个句型的情况下,预读到'b;'这条句型的时候由于两者之间没有用';'
    //隔开,因此提示错误2;
    //第二种可能:将'c=a*b++'作为一个句型,'++b;'作为一个句型两者之间用';'隔开;因此提示错误2;
    //用一个简单的例子:c=a++b;当然这条语句是错误的,错误提示:missing ';' before identifier 'b'但是它避免了以上例子中的第一个错误;
    //但是它的';'有两种加法1.c=a++;b;或者2.c=a;++b;也就是以上个人推测的两种可能;具体如何,还得根据编译器的算法才能够得知;
    printf("c=%d\n",c);
}
2010-01-23 12:19
快速回复:c=a*b+++b
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.014977 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved