++符号的贪心方法与左值右值和未定义表达式

编译器将程序分解成符号的方法是,从左到右一个一个字符地读入,如果该字符可能组成一个符号,
那么再读入下一个字符,判断已经读入的两个字符组成的字符串是否可能是一个符号的组
成部分;如果可能,继续读入下一个字符,重复上述判断,直到读入的字符组成的字符串
已不再可能组成一个有意义的符号。
这个处理的策略被称为“贪心法”

 

要看懂下面式子,明白两点:

1、左值右值区别。

      左值简单理解为某一变量(有地址空间),可以出现在=的左边,可进行赋值。

      右值:出现在=的右边,可以读取到它的值。

2、未定义表达式 :同一个序列中同一变量只能改变一次。(未定义表达式产生无法预知结果)

3、后置++有优先级高于前置++

                 

++i++ + i++ +i =(++(i++)) + (i++)+i。//贪心法

但是这个表达式有错误:

1、是一个未定义表达式(同一个序列中同一变量只能改变一次);这个表达式i值改变3次。

2、表达式有错误。第一个运算i++会产生一个右值(仅仅是取i的值,而不是获取i)。做完该次运算后再与前一个++,出现错误。右值只允许赋值给左值,无法自加1(无法对存储空间进行操作).



  //遇到,或者;表示该运算获取完整可以计算

int i = 3;
int j = (i++,i++,i++);//遇到,表示可以运算。故j=5,i=6

int i =3;
int j = (i++) + (i++) + (i++);//遇到;表示可以运算。故j=9,i=i+3=6

for(i=0,printf("First=%d",i);
    printf("Second=%d",i),i<10;//逗号表达式,必须把i<10放在后面。判断条件一直成立,不会退出
    i++,printf("Third=%d",i))//i++和printf("Third=%d",i)顺序改变 也会改变打印结果
{
    printf("Fouth=%d",i);
}                     


你可能感兴趣的:(c语言深度剖析)