找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 6461|回復(fù): 48
打印 上一主題 下一主題
收起左側(cè)

初學(xué)C51單片機(jī),遇到個(gè)奇怪的C語言問題

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:553885 發(fā)表于 2019-6-3 16:43 來自手機(jī) | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
int x=0,y=0;
y=x++;

按道理x=1,y=0
實(shí)際結(jié)果都是0

麻煩大家有空幫我看看,問題在哪,先謝了
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:277550 發(fā)表于 2019-6-3 21:17 | 只看該作者
++符號(hào),在變量名的右邊,是先取值、再自加1,即先把x值給y、x再自加1




~~~~~~~~~~~~~~~~~
回復(fù)

使用道具 舉報(bào)

板凳
ID:415123 發(fā)表于 2019-6-3 21:27 | 只看該作者
不知你是怎么看到結(jié)果的,如果軟件仿真,斷點(diǎn)設(shè)置在y=x++;之后,應(yīng)該就是看到這個(gè)結(jié)果y=0,x=1,。
回復(fù)

使用道具 舉報(bào)

地板
ID:155507 發(fā)表于 2019-6-3 22:26 | 只看該作者
這個(gè)不奇怪,你用x++ ,這個(gè)是先賦值給y 才加一
回復(fù)

使用道具 舉報(bào)

5#
ID:554215 發(fā)表于 2019-6-3 22:59 | 只看該作者
單純從語法角度,執(zhí)行完y=x++;這句后,y=0,x=1是肯定的。
回復(fù)

使用道具 舉報(bào)

6#
ID:388197 發(fā)表于 2019-6-4 00:42 | 只看該作者
運(yùn)算優(yōu)先級(jí)的問題? ++跟賦值號(hào)的優(yōu)先級(jí)我也不記得了,這種東西在譚浩強(qiáng)的書里面最多,什么i++ ++i之類的....實(shí)際應(yīng)用最簡(jiǎn)單的辦法就是分開2行或者加個(gè)括號(hào)什么的.根本沒必要去記那些運(yùn)算優(yōu)先級(jí)...
像這樣寫
x++;
y=x;
就肯定不會(huì)有問題了.
回復(fù)

使用道具 舉報(bào)

7#
ID:511890 發(fā)表于 2019-6-4 02:13 | 只看該作者
完整代碼沒有怎么看。。。根據(jù)你給的代碼,確實(shí)是y=0; x=1;。
回復(fù)

使用道具 舉報(bào)

8#
ID:213173 發(fā)表于 2019-6-4 06:14 | 只看該作者
樓主要搞清楚x++與++x的區(qū)別,y=x++;表示x先對(duì)y賦值然后再自+1,y=++x;表示x先自+1然后再對(duì)y賦值。
回復(fù)

使用道具 舉報(bào)

9#
ID:123289 發(fā)表于 2019-6-4 08:19 | 只看該作者
這個(gè)問題取決于編譯平臺(tái)如何判定。
樓主可以按照自己的想法,做一個(gè)平臺(tái),就按你的意思編譯。也不能認(rèn)為你就是錯(cuò)的。
回復(fù)

使用道具 舉報(bào)

10#
ID:158375 發(fā)表于 2019-6-4 08:31 | 只看該作者
樓主應(yīng)該先看看C運(yùn)算的優(yōu)先級(jí),運(yùn)算優(yōu)先級(jí)搞不清楚,其他都是瞎扯。
回復(fù)

使用道具 舉報(bào)

11#
ID:554341 發(fā)表于 2019-6-4 09:15 | 只看該作者
這個(gè)不奇怪,你用x++ ,這個(gè)是先賦值給y 才加一
x++與++x的區(qū)別,y=x++;表示x先對(duì)y賦值然后再自+1,y=++x;表示x先自+1然后再對(duì)y賦值。
++符號(hào),在變量名的右邊,是先取值、再自加1,即先把x值給y、x再自加1

回復(fù)

使用道具 舉報(bào)

12#
ID:554383 發(fā)表于 2019-6-4 09:38 | 只看該作者
單純從規(guī)范的角度,不建議這種寫法。
回復(fù)

使用道具 舉報(bào)

13#
ID:553885 發(fā)表于 2019-6-4 09:46 來自手機(jī) | 只看該作者
首先感謝大家的回復(fù)。
下面是代碼和仿真頁面,方向綠色箭頭的代碼居然沒有編譯,所以結(jié)果就是0(紅色圈內(nèi))

IMG_20190604_094031.jpg (2.16 MB, 下載次數(shù): 59)

IMG_20190604_094031.jpg
回復(fù)

使用道具 舉報(bào)

14#
ID:553885 發(fā)表于 2019-6-4 09:52 來自手機(jī) | 只看該作者
接下來,我把代碼,j=i++;改為 i++; 也就是說,去掉j=,所有代碼就全部編譯了,而且結(jié)果也正確。

也不知道為什么,但同樣的代碼在c++中就沒有這個(gè)問題。是不是和keil有關(guān)系,我用的是keil4

IMG_20190604_094749.jpg (2.18 MB, 下載次數(shù): 44)

IMG_20190604_094749.jpg
回復(fù)

使用道具 舉報(bào)

15#
ID:552592 發(fā)表于 2019-6-4 10:59 | 只看該作者
++和--在后面,先賦值再++。在前面先++再賦值
回復(fù)

使用道具 舉報(bào)

16#
ID:123289 發(fā)表于 2019-6-4 11:25 | 只看該作者
沒有什么為什么,就是編譯平臺(tái)的定義,換個(gè)平臺(tái)或許就可以。
所以,用KELL,就看KELL的的規(guī)定!
盡可采用“不會(huì)引起岐義方式寫程序”
不過某些老師,為了顯擺自己,就是歡喜搞一些易歧義問題來坑人。
回復(fù)

使用道具 舉報(bào)

17#
ID:139042 發(fā)表于 2019-6-4 12:09 | 只看該作者
這個(gè)是keil的代碼優(yōu)化的結(jié)果,x和y對(duì)整個(gè)程序無實(shí)際意義,kei給優(yōu)化掉了。你可以試著改改優(yōu)化等級(jí)。
回復(fù)

使用道具 舉報(bào)

18#
ID:511890 發(fā)表于 2019-6-4 18:09 | 只看該作者
z43218 發(fā)表于 2019-6-4 09:52
接下來,我把代碼,j=i++;改為 i++; 也就是說,去掉j=,所有代碼就全部編譯了,而且結(jié)果也正確。

也不知 ...

經(jīng)過測(cè)試,這是Keil的坑。感覺所有的等式剛開始都不會(huì)被執(zhí)行,只有++的變量被調(diào)用了,才會(huì)執(zhí)行。
如下修改成下面就好了。
        int i,j,k;
        i=0;
        j=0;
        j=i++;
        k=i;
        LED =0;
        while(1);
回復(fù)

使用道具 舉報(bào)

19#
ID:493864 發(fā)表于 2019-6-4 19:32 | 只看該作者
加號(hào)在右邊,那是先進(jìn)行賦值在加一,所以執(zhí)行語句后值不改變
回復(fù)

使用道具 舉報(bào)

20#
ID:550032 發(fā)表于 2019-6-4 21:39 | 只看該作者
“++”放在左邊才是1,放在右邊是先賦值再計(jì)算
回復(fù)

使用道具 舉報(bào)

21#
ID:245771 發(fā)表于 2019-6-5 09:05 | 只看該作者
建議詳細(xì)查看c基礎(chǔ),查閱運(yùn)算符結(jié)合規(guī)則,然后編程實(shí)踐
回復(fù)

使用道具 舉報(bào)

22#
ID:461604 發(fā)表于 2019-6-5 09:56 | 只看該作者
y = ++x,相當(dāng)于 x=x+1; y= x;
y = x++,相當(dāng)于 y = x; x=x+1;
回復(fù)

使用道具 舉報(bào)

23#
ID:93224 發(fā)表于 2019-6-5 17:45 | 只看該作者
是0就對(duì)了
回復(fù)

使用道具 舉報(bào)

24#
ID:553885 發(fā)表于 2019-6-5 21:29 來自手機(jī) | 只看該作者
非常感謝大家來解答問題,
現(xiàn)在問題已經(jīng)找到,如下面照片,是keil的C51編譯優(yōu)化設(shè)置,軟件默認(rèn)是8,改為7,問題就解決了

IMG_20190605_211228.jpg (626.36 KB, 下載次數(shù): 46)

IMG_20190605_211228.jpg
回復(fù)

使用道具 舉報(bào)

25#
ID:556073 發(fā)表于 2019-6-5 22:39 | 只看該作者
這個(gè)問題有點(diǎn)難
回復(fù)

使用道具 舉報(bào)

26#
ID:555552 發(fā)表于 2019-6-6 00:01 來自手機(jī) | 只看該作者
+號(hào)在右邊
回復(fù)

使用道具 舉報(bào)

27#
ID:514901 發(fā)表于 2019-6-7 11:43 | 只看該作者
int x=0,y=0;     y=x++;   printf(“x=%d,y=%d”,x,y);  就會(huì)看到x=1,y=0
回復(fù)

使用道具 舉報(bào)

28#
ID:316256 發(fā)表于 2019-6-7 15:47 | 只看該作者
運(yùn)算優(yōu)先級(jí)的問題
回復(fù)

使用道具 舉報(bào)

29#
ID:557357 發(fā)表于 2019-6-7 21:10 | 只看該作者
這題很簡(jiǎn)單  首先x,y初值都是零,執(zhí)行y=x++這個(gè)語句時(shí)  因?yàn)閤++是先把值給y  自身才加一  所以y=0,然后x++這個(gè)語句只是單純的  實(shí)際上x沒有得到值所以還是為零  不知道這樣說你能不能明白
回復(fù)

使用道具 舉報(bào)

30#
ID:516571 發(fā)表于 2019-6-8 10:57 | 只看該作者
把兩個(gè)+號(hào)放在x的左邊就是先算x+1的值賦給y
回復(fù)

使用道具 舉報(bào)

31#
ID:561132 發(fā)表于 2019-6-12 18:34 | 只看該作者
y=x++是先用x=0再在+1
回復(fù)

使用道具 舉報(bào)

32#
ID:561132 發(fā)表于 2019-6-12 18:35 | 只看該作者
y=x++是先用再+1    y=++x才是+1再用
回復(fù)

使用道具 舉報(bào)

33#
ID:368940 發(fā)表于 2019-6-12 20:11 | 只看該作者
是先x賦給y,然后x自加1
回復(fù)

使用道具 舉報(bào)

34#
ID:549556 發(fā)表于 2019-6-12 20:43 | 只看該作者
是對(duì)的哦 ,建議你看下程序有沒有錯(cuò)誤
回復(fù)

使用道具 舉報(bào)

35#
ID:451448 發(fā)表于 2019-6-12 22:20 | 只看該作者
優(yōu)先級(jí)不一樣,++的優(yōu)先級(jí)小于=的優(yōu)先級(jí)
回復(fù)

使用道具 舉報(bào)

36#
ID:448860 發(fā)表于 2019-6-12 22:30 | 只看該作者
y應(yīng)該是y=y++吧
回復(fù)

使用道具 舉報(bào)

37#
ID:532564 發(fā)表于 2019-6-13 17:12 | 只看該作者
x++是先取x的值 再執(zhí)行x=x+1   你想要預(yù)期結(jié)果的話要寫y=++x
回復(fù)

使用道具 舉報(bào)

38#
ID:560178 發(fā)表于 2019-6-13 17:15 | 只看該作者
x++,是x先取值0、就是y=0,然后x再自加1,x=1了;
回復(fù)

使用道具 舉報(bào)

39#
ID:560178 發(fā)表于 2019-6-13 17:17 | 只看該作者
這是對(duì)的
回復(fù)

使用道具 舉報(bào)

40#
ID:562123 發(fā)表于 2019-6-13 21:02 | 只看該作者
把++的語法好好復(fù)習(xí)一下吧
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表