a++ 与 ++a

如果说哪种操作符能让我们捕捉到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 5float 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') ;
现在看很明显了





原文链接: https://www.cnblogs.com/bugman/archive/2011/09/20/2182953.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/32734

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月8日 上午9:52
下一篇 2023年2月8日 上午9:53

相关推荐