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

本文介绍了编译器如何使用贪心法解析程序符号,并详细解释了左值、右值的概念及其在表达式中的应用。同时,通过具体实例探讨了表达式的评估顺序和常见错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

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

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值