C、C++差异之左值右值

本文探讨了C与C++在左值处理上的不同之处,重点介绍了自增运算符、赋值运算符及条件运算符的行为差异,并通过具体示例展示了这些差异如何影响代码的有效性和灵活性。

C与C++在语法细节上还是有一些差异的,虽然一般情况下可能这些差异不足以造成结果的区别,但有些代码确实会有影响。


这次,主要总结下左值右值的差异。

在C中,很多左值运算符的结果都不再是左值,然而在C++中,只要逻辑上可行,左值运算符的结果仍然是左值。C++的这种方式,让运算符表达式之间的灵活性更大。


1、++i,我们都习惯了在C++中,i 自加后返回自己;然而在C中i自加后,返回的是个临时的副本,即和i++是一样的,此结果不能作为左值,即(++i)=0非法。所以我想这就是为什么代码中还是很多for循环中使用着i++,因为在C中,我认为i++与++i的效率是一样的。

2、=,同样的,C中结果是右值,即 (a = b) = c在C中是不合法的,然而在C++中是可以的。

3、?:,C中返回的分支结果是右值,在C++中规定是,只要两分支都是左值且类型相同,结果亦为左值(参见,C++程序设计语言-特别版 第6.2节)。即如下:

{   
   (1 ? i=11 : j)=22; // C++结果是i = 22,在C中非法
   printf("%d %d \n", i, j);
   
   1 ? i=11 : j=22; // C++结果却是i = 11,在C中非法,正确写法为: 1 ? i=11 : (j=22);
   printf("%d %d \n", i, j);
   // 本以为结果和上面相同,因为 ?:的优先级高于 =,按理说应该等价于上面的表达式
   // 然而这就是现实,事物永远不会按着你的想法来。
   // C++中的语法规则决定 等价于:
   // (1) ? (i=11) : (j=22);
   // 再同样参见C++程序设计语言-特别版 第6.2节,这样奇葩的表达式:
   // a = b < c ? d = e : f = g; 等价于:
   // a = ( (b < c) ? (d = e) : (f = g) );
   // 这就是所谓的语法了。不过这也挺符合程序员的想法的。
} 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值