HelloWorld

ASM,C,LUA,LINUX(gentoo)
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

a++ 与 ++a

Posted on 2011-09-20 23:11  光铭  阅读(306)  评论(0)    收藏  举报

如果说哪种操作符能让我们捕捉到C变成的感觉,那必然是++或者--这两种之一            ----Pointers on C

他们要求操作数必须是左值

认识到这一点很重要:

前缀和后缀的递增操作符都复制一份变量的拷贝。前缀操作符先增加变量的值再复制,后缀操作符先复制在增加变量的值
这些操作符的结果并不是被他们修改的变量,而是变量值的拷贝。
例如

int a = 10;

int c = a++;

++操作符先把a拷贝,然后赋值给c,c变成了10,然后增加a的值,a变成了11。

所以 a++和++a是无法作为左值的

++a=10;//ERROR

它们的结果是值的拷贝,而不是变量本身,你无法向一个值进行赋值

#define N_VALUES 5
float values[N_VALUES]
float *vp;
for(vp = &values[0]; vp < &values[N_VALUES];)
*vp++ = 0;
//这里后缀的++就可以移到for的第三个表达式,而前缀的不行
for(vp = &values[0]; vp < &values[N_VALUES];vp++)
*vp = 0;

for(vp = &values[N_VALUES]; vp > &values[0];)
*--vp = 0;

在for循环的第三个表达式中a++和++a是一样的作用

while循环中的a++和++a

int a = 0;
while(a++<10);
//a++的值从0到9,循环10次。循环结束时a的值是10。(倒着推,a++的值是9,a肯定是10)那么a就是从1到10。
int a = 0;
while(++a<10);
//++a的值从1到9, 循环9次。循环结束时a的值是9。 (同样倒着推,++a的值是9,a肯定是9)a也是从1到9。


2.表达式的值

赋值表达式的值是所赋的值,是个常量

#include<stdio.h>
int main(void){
	int a;
	int b = 10;
	(a=b)=5;
	printf("%d\n",a);
	return 0;
}


ass.c:5: error: lvalue required as left operand of assignment
//所以(a=b)的值既不是a也不是b,是10,10=5是错误的
再比如说
return a = 10;
就相当于 return 10;
再比如说
while((*des++ = *src++) !='\0') ;
现在看很明显了