一、关于C和C++如何解析符号的问题
因为符号有单个字符和多字符(+、-、++、--、、/*等),那么当编译器读取了一个字符(如+)后,后面又跟了一个+,那么编译器就必须作出判断将它们分别作为两个符号对待还是合并成一个符号看待。这时候就需要编译器给出判断机制,C、C++的编译器判断机制是“贪心法”,即:从左到右一个字符一个字符的读入,如果该字符可能组成一个符号,那么再读入下一个字符,判断已读入的两个字符组成的字符串是否可能是一个符号的组成部分;如果可能,继续读入下一个字符,重复上面的判断直到读入的字符与之前的不再可能组成一个有意义的符号为止。
如:a---b的解释是(a--)-b
但是需要注意:除了字符串与字符常量,符号中间不能嵌套有空白(空格符、制表符和换行符),如==是单个符号,而= =则是两个符号
二、八进制
以前从来没注意过,如果一个整型常量的第一个字符时数字0的话,那么该常量将被视为八进制数。如012,输出时是10.
三、关于i++,++i
为什么i++=5错误而++i=5是正确的??
i++的实现是:
temp = i; i = i+1; return temp;
而++i的实现是:
i = i+1; return i;
所以对于我们提出来的问题已经能得到解决了:i++=5; 是错误的是因为i++返回的是编译器自动分配的临时变量temp,而这个temp并不是你程序中定义的可寻址变量的引用,也就是说你不能通过地址对它进行操作.(换句话说就是不能作为左值)++i=5;是正确的就是因为其返回值就是i;
注:关于i++和++i的效率问题:按上面分析来说,++i的效率是比i++效率高些的.(VC)对于内置(built-in)类型,写++变量和变量++编译器都经过优化,采用++变量的方式.但是对于自定义类对象如果重载先++,和后++操作符那么要使用先++,因为这时编译器,不可能对你的类型进行优化!
三、关于左值与右值
首先,要弄清楚哪些情况下是必须要用左值的?
下列运算符的操作数要求左值:sizeof运算符, 取地址运算符 & , ++ 运算符, -- 运算符,赋值 = 运算符的左侧,成员 . 运算符的左侧。
其次,怎么理解左值与右值?
1.通俗的讲,左值就是能够出现在赋值符号左面的东西,而右值就是那些可以出现在赋值符号右面的东西了。"我觉得这句话在刚开始理解的时候是什么用都没有的一句废话.因为我们都不知道哪些东西应该放在赋值符号的左边,哪些东西又应该放在赋值符号的右边这样说是没有意义的.
2.接着我找到个比较靠谱的定义:左值是指具有对应的可由用户访问的存储单元,并且能由用户改变其值的量。如一个变量就是一个左值,因为它对应着一个存储单元,并可由编程者通过变量名访问和改变其值。 (下面的第三点是c++primer中的)
3.变量和文字常量都有存储区,并且有相关的类型。区别在于变量是可寻址的(addressable)对于每一个变量都有两个值与其相联:
1).它的数据值,存储在某个内存地址中。有时这个值也被称为对象的右值(rvalue,读做are-value).我们也可认为右值的意思是被读取的值(read value)。 文字常量和变量都可 被用作右值。
2).它的地址值——即存储数据值的那块内存的地址。它有时被称为变量的左值(lvalue,读作ell-value)。我们也可认为左值的意思是位置值location value文字常量不能被用作左值