#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);
}
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);
}