找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4078|回复: 48
收起左侧

初学C51单片机,遇到个奇怪的C语言问题

  [复制链接]
ID:553885 发表于 2019-6-3 16:43 来自手机 | 显示全部楼层 |阅读模式
int x=0,y=0;
y=x++;

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

麻烦大家有空帮我看看,问题在哪,先谢了
回复

使用道具 举报

ID:277550 发表于 2019-6-3 21:17 | 显示全部楼层
++符号,在变量名的右边,是先取值、再自加1,即先把x值给y、x再自加1




~~~~~~~~~~~~~~~~~
回复

使用道具 举报

ID:415123 发表于 2019-6-3 21:27 | 显示全部楼层
不知你是怎么看到结果的,如果软件仿真,断点设置在y=x++;之后,应该就是看到这个结果y=0,x=1,。
回复

使用道具 举报

ID:155507 发表于 2019-6-3 22:26 | 显示全部楼层
这个不奇怪,你用x++ ,这个是先赋值给y 才加一
回复

使用道具 举报

ID:554215 发表于 2019-6-3 22:59 | 显示全部楼层
单纯从语法角度,执行完y=x++;这句后,y=0,x=1是肯定的。
回复

使用道具 举报

ID:388197 发表于 2019-6-4 00:42 | 显示全部楼层
运算优先级的问题? ++跟赋值号的优先级我也不记得了,这种东西在谭浩强的书里面最多,什么i++ ++i之类的....实际应用最简单的办法就是分开2行或者加个括号什么的.根本没必要去记那些运算优先级...
像这样写
x++;
y=x;
就肯定不会有问题了.
回复

使用道具 举报

ID:511890 发表于 2019-6-4 02:13 | 显示全部楼层
完整代码没有怎么看。。。根据你给的代码,确实是y=0; x=1;。
回复

使用道具 举报

ID:213173 发表于 2019-6-4 06:14 | 显示全部楼层
楼主要搞清楚x++与++x的区别,y=x++;表示x先对y赋值然后再自+1,y=++x;表示x先自+1然后再对y赋值。
回复

使用道具 举报

ID:123289 发表于 2019-6-4 08:19 | 显示全部楼层
这个问题取决于编译平台如何判定。
楼主可以按照自己的想法,做一个平台,就按你的意思编译。也不能认为你就是错的。
回复

使用道具 举报

ID:158375 发表于 2019-6-4 08:31 | 显示全部楼层
楼主应该先看看C运算的优先级,运算优先级搞不清楚,其他都是瞎扯。
回复

使用道具 举报

ID:554341 发表于 2019-6-4 09:15 | 显示全部楼层
这个不奇怪,你用x++ ,这个是先赋值给y 才加一
x++与++x的区别,y=x++;表示x先对y赋值然后再自+1,y=++x;表示x先自+1然后再对y赋值。
++符号,在变量名的右边,是先取值、再自加1,即先把x值给y、x再自加1

回复

使用道具 举报

ID:554383 发表于 2019-6-4 09:38 | 显示全部楼层
单纯从规范的角度,不建议这种写法。
回复

使用道具 举报

ID:553885 发表于 2019-6-4 09:46 来自手机 | 显示全部楼层
首先感谢大家的回复。
下面是代码和仿真页面,方向绿色箭头的代码居然没有编译,所以结果就是0(红色圈内)
IMG_20190604_094031.jpg
回复

使用道具 举报

ID:553885 发表于 2019-6-4 09:52 来自手机 | 显示全部楼层
接下来,我把代码,j=i++;改为 i++; 也就是说,去掉j=,所有代码就全部编译了,而且结果也正确。

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

使用道具 举报

ID:552592 发表于 2019-6-4 10:59 | 显示全部楼层
++和--在后面,先赋值再++。在前面先++再赋值
回复

使用道具 举报

ID:123289 发表于 2019-6-4 11:25 | 显示全部楼层
没有什么为什么,就是编译平台的定义,换个平台或许就可以。
所以,用KELL,就看KELL的的规定!
尽可采用“不会引起岐义方式写程序”
不过某些老师,为了显摆自己,就是欢喜搞一些易歧义问题来坑人。
回复

使用道具 举报

ID:139042 发表于 2019-6-4 12:09 | 显示全部楼层
这个是keil的代码优化的结果,x和y对整个程序无实际意义,kei给优化掉了。你可以试着改改优化等级。
回复

使用道具 举报

ID:511890 发表于 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);
回复

使用道具 举报

ID:493864 发表于 2019-6-4 19:32 | 显示全部楼层
加号在右边,那是先进行赋值在加一,所以执行语句后值不改变
回复

使用道具 举报

ID:550032 发表于 2019-6-4 21:39 | 显示全部楼层
“++”放在左边才是1,放在右边是先赋值再计算
回复

使用道具 举报

ID:245771 发表于 2019-6-5 09:05 | 显示全部楼层
建议详细查看c基础,查阅运算符结合规则,然后编程实践
回复

使用道具 举报

ID:461604 发表于 2019-6-5 09:56 | 显示全部楼层
y = ++x,相当于 x=x+1; y= x;
y = x++,相当于 y = x; x=x+1;
回复

使用道具 举报

ID:93224 发表于 2019-6-5 17:45 | 显示全部楼层
是0就对了
回复

使用道具 举报

ID:553885 发表于 2019-6-5 21:29 来自手机 | 显示全部楼层
非常感谢大家来解答问题,
现在问题已经找到,如下面照片,是keil的C51编译优化设置,软件默认是8,改为7,问题就解决了
IMG_20190605_211228.jpg
回复

使用道具 举报

ID:556073 发表于 2019-6-5 22:39 | 显示全部楼层
这个问题有点难
回复

使用道具 举报

ID:555552 发表于 2019-6-6 00:01 来自手机 | 显示全部楼层
+号在右边
回复

使用道具 举报

ID:514901 发表于 2019-6-7 11:43 | 显示全部楼层
int x=0,y=0;     y=x++;   printf(“x=%d,y=%d”,x,y);  就会看到x=1,y=0
回复

使用道具 举报

ID:316256 发表于 2019-6-7 15:47 | 显示全部楼层
运算优先级的问题
回复

使用道具 举报

ID:557357 发表于 2019-6-7 21:10 | 显示全部楼层
这题很简单  首先x,y初值都是零,执行y=x++这个语句时  因为x++是先把值给y  自身才加一  所以y=0,然后x++这个语句只是单纯的  实际上x没有得到值所以还是为零  不知道这样说你能不能明白
回复

使用道具 举报

ID:516571 发表于 2019-6-8 10:57 | 显示全部楼层
把两个+号放在x的左边就是先算x+1的值赋给y
回复

使用道具 举报

ID:561132 发表于 2019-6-12 18:34 | 显示全部楼层
y=x++是先用x=0再在+1
回复

使用道具 举报

ID:561132 发表于 2019-6-12 18:35 | 显示全部楼层
y=x++是先用再+1    y=++x才是+1再用
回复

使用道具 举报

ID:368940 发表于 2019-6-12 20:11 | 显示全部楼层
是先x赋给y,然后x自加1
回复

使用道具 举报

ID:549556 发表于 2019-6-12 20:43 | 显示全部楼层
是对的哦 ,建议你看下程序有没有错误
回复

使用道具 举报

ID:451448 发表于 2019-6-12 22:20 | 显示全部楼层
优先级不一样,++的优先级小于=的优先级
回复

使用道具 举报

ID:448860 发表于 2019-6-12 22:30 | 显示全部楼层
y应该是y=y++吧
回复

使用道具 举报

ID:532564 发表于 2019-6-13 17:12 | 显示全部楼层
x++是先取x的值 再执行x=x+1   你想要预期结果的话要写y=++x
回复

使用道具 举报

ID:560178 发表于 2019-6-13 17:15 | 显示全部楼层
x++,是x先取值0、就是y=0,然后x再自加1,x=1了;
回复

使用道具 举报

ID:560178 发表于 2019-6-13 17:17 | 显示全部楼层
这是对的
回复

使用道具 举报

ID:562123 发表于 2019-6-13 21:02 | 显示全部楼层
把++的语法好好复习一下吧
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表