标题: 初学C51单片机,遇到个奇怪的C语言问题 [打印本页]

作者: z43218    时间: 2019-6-3 16:43
标题: 初学C51单片机,遇到个奇怪的C语言问题
int x=0,y=0;
y=x++;

按道理x=1,y=0
实际结果都是0

麻烦大家有空帮我看看,问题在哪,先谢了
作者: devcang    时间: 2019-6-3 21:17
++符号,在变量名的右边,是先取值、再自加1,即先把x值给y、x再自加1




~~~~~~~~~~~~~~~~~
作者: honey_teck    时间: 2019-6-3 21:27
不知你是怎么看到结果的,如果软件仿真,断点设置在y=x++;之后,应该就是看到这个结果y=0,x=1,。
作者: angmall    时间: 2019-6-3 22:26
这个不奇怪,你用x++ ,这个是先赋值给y 才加一

作者: y309976659    时间: 2019-6-3 22:59
单纯从语法角度,执行完y=x++;这句后,y=0,x=1是肯定的。
作者: cjm82    时间: 2019-6-4 00:42
运算优先级的问题? ++跟赋值号的优先级我也不记得了,这种东西在谭浩强的书里面最多,什么i++ ++i之类的....实际应用最简单的办法就是分开2行或者加个括号什么的.根本没必要去记那些运算优先级...
像这样写
x++;
y=x;
就肯定不会有问题了.
作者: 幻剑心    时间: 2019-6-4 02:13
完整代码没有怎么看。。。根据你给的代码,确实是y=0; x=1;。
作者: wulin    时间: 2019-6-4 06:14
楼主要搞清楚x++与++x的区别,y=x++;表示x先对y赋值然后再自+1,y=++x;表示x先自+1然后再对y赋值。
作者: yzwzfyz    时间: 2019-6-4 08:19
这个问题取决于编译平台如何判定。
楼主可以按照自己的想法,做一个平台,就按你的意思编译。也不能认为你就是错的。

作者: 笨笨兔    时间: 2019-6-4 08:31
楼主应该先看看C运算的优先级,运算优先级搞不清楚,其他都是瞎扯。
作者: iccee    时间: 2019-6-4 09:15
这个不奇怪,你用x++ ,这个是先赋值给y 才加一
x++与++x的区别,y=x++;表示x先对y赋值然后再自+1,y=++x;表示x先自+1然后再对y赋值。
++符号,在变量名的右边,是先取值、再自加1,即先把x值给y、x再自加1


作者: laofang20190604    时间: 2019-6-4 09:38
单纯从规范的角度,不建议这种写法。
作者: z43218    时间: 2019-6-4 09:46
首先感谢大家的回复。
下面是代码和仿真页面,方向绿色箭头的代码居然没有编译,所以结果就是0(红色圈内)

IMG_20190604_094031.jpg (2.16 MB, 下载次数: 59)

IMG_20190604_094031.jpg

作者: z43218    时间: 2019-6-4 09:52
接下来,我把代码,j=i++;改为 i++; 也就是说,去掉j=,所有代码就全部编译了,而且结果也正确。

也不知道为什么,但同样的代码在c++中就没有这个问题。是不是和keil有关系,我用的是keil4

IMG_20190604_094749.jpg (2.18 MB, 下载次数: 44)

IMG_20190604_094749.jpg

作者: Pee_32    时间: 2019-6-4 10:59
++和--在后面,先赋值再++。在前面先++再赋值
作者: yzwzfyz    时间: 2019-6-4 11:25
没有什么为什么,就是编译平台的定义,换个平台或许就可以。
所以,用KELL,就看KELL的的规定!
尽可采用“不会引起岐义方式写程序”
不过某些老师,为了显摆自己,就是欢喜搞一些易歧义问题来坑人。
作者: chumingyu    时间: 2019-6-4 12:09
这个是keil的代码优化的结果,x和y对整个程序无实际意义,kei给优化掉了。你可以试着改改优化等级。

作者: 幻剑心    时间: 2019-6-4 18:09
z43218 发表于 2019-6-4 09:52
接下来,我把代码,j=i++;改为 i++; 也就是说,去掉j=,所有代码就全部编译了,而且结果也正确。

也不知 ...

经过测试,这是Keil的坑。感觉所有的等式刚开始都不会被执行,只有++的变量被调用了,才会执行。
如下修改成下面就好了。
        int i,j,k;
        i=0;
        j=0;
        j=i++;
        k=i;
        LED =0;
        while(1);
作者: a51    时间: 2019-6-4 19:32
加号在右边,那是先进行赋值在加一,所以执行语句后值不改变
作者: somesun    时间: 2019-6-4 21:39
“++”放在左边才是1,放在右边是先赋值再计算
作者: chenc    时间: 2019-6-5 09:05
建议详细查看c基础,查阅运算符结合规则,然后编程实践
作者: ZGJ20170905    时间: 2019-6-5 09:56
y = ++x,相当于 x=x+1; y= x;
y = x++,相当于 y = x; x=x+1;
作者: lele5211314    时间: 2019-6-5 17:45
是0就对了
作者: z43218    时间: 2019-6-5 21:29
非常感谢大家来解答问题,
现在问题已经找到,如下面照片,是keil的C51编译优化设置,软件默认是8,改为7,问题就解决了

IMG_20190605_211228.jpg (626.36 KB, 下载次数: 46)

IMG_20190605_211228.jpg

作者: zhang_s    时间: 2019-6-5 22:39
这个问题有点难
作者: 羽翼qhy    时间: 2019-6-6 00:01
+号在右边
作者: 郑汉松    时间: 2019-6-7 11:43
int x=0,y=0;     y=x++;   printf(“x=%d,y=%d”,x,y);  就会看到x=1,y=0
作者: SOsong    时间: 2019-6-7 15:47
运算优先级的问题
作者: sudoapt    时间: 2019-6-7 21:10
这题很简单  首先x,y初值都是零,执行y=x++这个语句时  因为x++是先把值给y  自身才加一  所以y=0,然后x++这个语句只是单纯的  实际上x没有得到值所以还是为零  不知道这样说你能不能明白
作者: 狂野的野马    时间: 2019-6-8 10:57
把两个+号放在x的左边就是先算x+1的值赋给y
作者: 1008622    时间: 2019-6-12 18:34
y=x++是先用x=0再在+1
作者: 1008622    时间: 2019-6-12 18:35
y=x++是先用再+1    y=++x才是+1再用
作者: cyfdc51    时间: 2019-6-12 20:11
是先x赋给y,然后x自加1
作者: 徐佳俊    时间: 2019-6-12 20:43
是对的哦 ,建议你看下程序有没有错误
作者: CJ_Z    时间: 2019-6-12 22:20
优先级不一样,++的优先级小于=的优先级
作者: Terryzsq    时间: 2019-6-12 22:30
y应该是y=y++吧
作者: stephanie_han    时间: 2019-6-13 17:12
x++是先取x的值 再执行x=x+1   你想要预期结果的话要写y=++x
作者: chenquan111    时间: 2019-6-13 17:15
x++,是x先取值0、就是y=0,然后x再自加1,x=1了;
作者: chenquan111    时间: 2019-6-13 17:17
这是对的
作者: 963353797    时间: 2019-6-13 21:02
把++的语法好好复习一下吧
作者: 暴躁萝莉    时间: 2019-6-19 12:17
应该是所用软件的规则不一样吧。可能平台不支持这种语法
作者: 啦啦啦嘿嘿嘿    时间: 2019-6-19 18:23
运算优先级的问题?,++跟赋值号的优先级的优先问题,实际应用最简单的办法就是分开2行或者加个括号什么的.根本没必要去记那些运算优先级... 像这样写 x++; y=x; 就肯定不会有问题了.
作者: TP987150    时间: 2019-6-19 22:01
不呀,完全没有错。可能是你的编译器有问题,我用Codeblocks运行后,输出X=1,Y=0
作者: TP987150    时间: 2019-6-19 22:04
完全是正确的,可能是你的编译器有问题,或者你操作失误,我用的Codeblocks

27($(UN9YF2%@XW9XK$LJ$1.png (22.91 KB, 下载次数: 132)

27($(UN9YF2%@XW9XK$LJ$1.png

GA%T[5H_XB_3N_E}3Q%8W6R.png (250.23 KB, 下载次数: 139)

GA%T[5H_XB_3N_E}3Q%8W6R.png

作者: ping264888    时间: 2019-6-20 08:08
++X, 表示先自加, 再进行运算, 而 X++表示先运算, 后自加.
作者: peigongo    时间: 2019-6-20 09:46
是对的 你先看看那个++ -- 的运算
作者: 暗淡无存、    时间: 2019-6-20 11:54
这个是先赋值再加,++i是先加再赋值的

作者: yex19321    时间: 2019-6-20 12:07
x++是实现x自增,但是返回x原来的值的,
作者: 大西瓜嫖客    时间: 2019-6-20 15:41
printf输出之后实际结果是x=1,y=0




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1