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) ); // 这就是所谓的语法了。不过这也挺符合程序员的想法的。 }
本文出自 “v” 博客,请务必保留此出处http://4651077.blog.51cto.com/4641077/1613799
原文地址:http://4651077.blog.51cto.com/4641077/1613799