| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3059 人关注过本帖
标题:请问一个基础的问题
只看楼主 加入收藏
kevin_c
Rank: 1
等 级:新手上路
帖 子:28
专家分:5
注 册:2015-10-15
结帖率:91.67%
收藏
已结贴  问题点数:12 回复次数:17 
请问一个基础的问题
如:
int a = 1;
a=a++;
为什么a的值是1,而不是2;


我觉得应该是a的值先赋给a,然后a再自增1,所以输出a的时候应该是2才对呀
2016-05-13 19:14
wanglianyi1
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:14
帖 子:647
专家分:2067
注 册:2015-6-18
收藏
得分:2 
#include <stdio.h>
int main()
{
    int a = 1;
    a=a++;
    printf("a=%d\n",a);
}

输出a=1;这个在于
    a=a++;
    printf("a=%d\n",a);
相当于 a=a; printf("a=%d\n",a);a++;    此时a=1;

还是相当于a=a;a++; printf("a=%d\n",a);此时a=2;

[此贴子已经被作者于2016-5-13 19:37编辑过]

2016-05-13 19:31
kevin_c
Rank: 1
等 级:新手上路
帖 子:28
专家分:5
注 册:2015-10-15
收藏
得分:0 
回复 2楼 wanglianyi1
还是没懂
2016-05-13 20:49
林月儿
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:湖南
等 级:版主
威 望:138
帖 子:2277
专家分:10647
注 册:2015-3-19
收藏
得分:2 
int a = 1;
a=a++;
a++是单目运算,a=a++;表达式右边是先赋值再计算
那么左边被赋值对象得到的值为a

剑栈风樯各苦辛,别时冰雪到时春
2016-05-13 21:52
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10609
专家分:43210
注 册:2014-5-20
收藏
得分:2 
#include <stdio.h>
main()
{
    int a=0, b=0;
    for (int i=0; i<4; i++)
    {
        a = a++;
        printf("a=%d\n", a);
    }
    printf("\n");
    for (int i=0; i<4; i++)
    {
        b = a++;
        printf("b=%d\n", b);
    }
}
2016-05-13 22:36
wanglianyi1
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:14
帖 子:647
专家分:2067
注 册:2015-6-18
收藏
得分:0 
回复 3楼 kevin_c
其实不必钻牛角尖,你就记得++在变量后就是先使用变量,然后变量自加1,如果++在变量前,就是变量先自加1后再使用。至于还牵扯到=赋值运算符,你查下运算符的优先级,针对你的a=a++还要考虑自身覆盖的问题哦,同一个变量a在内存是一个位置哦。自己理解的,你参考下吧,也不一定就是对的,我也快被你绕晕了

[此贴子已经被作者于2016-5-13 23:05编辑过]

2016-05-13 23:02
lanke711
Rank: 9Rank: 9Rank: 9
来 自:流浪在天国之路
等 级:蜘蛛侠
威 望:7
帖 子:317
专家分:1437
注 册:2015-7-16
收藏
得分:2 
呃,++在变量后面,就是先给变量赋值,再递增。++在变量前面,就是先递增,再给变量赋值。

普通人之所以普通,是因为他们普遍有一个通病,那就是认为自己永远普通。
千夫所指,我亦坚持。就算被所有人误解,我也照样守护这一切。
我们总是觉得,这些灵魂的表情,傲慢自大,目中无人,其实,真正目中无人的是我们。它们傲慢的不过是表情,而我们傲慢的却是行为!
记得,是为了忘记!
只要想着有那么一天,我就能忍受现在的每一天!
灾难并不可怕,可怕的是心中没有了希望。
你以为我在天堂,其实我正在路上。
当你觉得自己走不到终点的时候,请不要放弃。或许你的对手也是这种感觉。
2016-05-14 04:02
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9031
专家分:54061
注 册:2011-1-18
收藏
得分:2 
未定义行为,本身就是错误的,因此没有为什么
2016-05-14 08:20
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10609
专家分:43210
注 册:2014-5-20
收藏
得分:0 
以下是引用kevin_c在2016-5-13 19:14:35的发言:

如:
int a = 1;
a=a++;
为什么a的值是1,而不是2;


我觉得应该是a的值先赋给a,然后a再自增1,所以输出a的时候应该是2才对呀

从编译代码看比较好理解
如:
#include <stdio.h>
main()
{
    int a=1;
    a=a++;
    printf("%d", a);
}
编译代码:
图片附件: 游客没有浏览图片的权限,请 登录注册

注释:
MOV DWORD PTR SS:[ESP+1C],1              ; int a=1
MOV EAX,DWORD PTR SS:[ESP+1C]            ; EAX = a
LEA EDX,DWORD PTR DS:[EAX+1]             ; EDX = EAX+1
MOV DWORD PTR SS:[ESP+1C],EDX            ; a = EDX  (a=2)
MOV DWORD PTR SS:[ESP+1C],EAX            ; a = EAX  (a=1)
MOV EAX,DWORD PTR SS:[ESP+1C]            ; EAX = a
MOV DWORD PTR SS:[ESP+4],EAX             ; a,printf()第2个参数
MOV DWORD PTR SS:[ESP],_Test.00404000    ; ASCII "%d",printf()第1个参数
CALL <JMP.&msvcrt.printf>                ; 执行 printf("%d", a)
MOV EAX,0                                ; 返回 0
LEAVE
RETN
关键在这里:
MOV DWORD PTR SS:[ESP+1C],EDX            ; a = EDX  (a=2)
MOV DWORD PTR SS:[ESP+1C],EAX            ; a = EAX  (a=1)
a++之后又还原了。

[此贴子已经被作者于2016-5-15 09:01编辑过]

2016-05-15 09:00
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10609
专家分:43210
注 册:2014-5-20
收藏
得分:0 
再看看这样,比较一下:
#include <stdio.h>
main()
{
    int a=1, b;
    b=a++;
    printf("%d", a);
}
图片附件: 游客没有浏览图片的权限,请 登录注册

MOV DWORD PTR SS:[ESP+1C],1              ; int a=1
MOV EAX,DWORD PTR SS:[ESP+1C]            ; EAX = a
LEA EDX,DWORD PTR DS:[EAX+1]             ; EDX = EAX+1
MOV DWORD PTR SS:[ESP+1C],EDX            ; a = EDX  (a=2)
MOV DWORD PTR SS:[ESP+18],EAX            ; b = EAX  (b=1)
MOV EAX,DWORD PTR SS:[ESP+1C]            ; EAX = a
MOV DWORD PTR SS:[ESP+4],EAX             ; a,printf()第2个参数   
MOV DWORD PTR SS:[ESP],_Test.00404000    ; ASCII "%d",printf()第1个参数
CALL <JMP.&msvcrt.printf>                ; 执行 printf("%d", a)
MOV EAX,0                                ; 返回 0
LEAVE
RETN
2016-05-15 09:11
快速回复:请问一个基础的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.088937 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved