作者lybercydia (lybercydia)
看板C_and_CPP
標題[問題] *(ptr++)放在等號兩邊 結果不同
時間Sat Apr 16 00:52:05 2022
開發平台:macOS、
https://ideone.com/uHaZAZ
編譯器:clang、GCC 8.3
問題:
利用指標運算將陣列arr[5]={31,17,33,22,16}的每個元素+10
這道程式碼,在版上分別於2011年與2015年都有人問過
但大家都說以下寫法沒差別,但怎麼Output不一樣><
預期的正確結果:{41,27,43,32,26}
錯誤結果:{31,41,51,61,71}
程式碼1:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int arr[5]={31,17,33,22,16};
int i,*ptr=arr;
for(i=0;i<5;i++){
//*(ptr++)=*ptr+10;
*ptr=*(ptr++)+10;
printf("*ptr=%d,\t%p\n",*ptr,ptr);
printf("arr[%d]=%d,\t%p\n\n",i,arr[i],&arr[i]);
}
return 0;
}
Output
*ptr=41, 0x7ff7b46d7724
arr[0]=31, 0x7ff7b46d7720
*ptr=51, 0x7ff7b46d7728
arr[1]=41, 0x7ff7b46d7724
*ptr=61, 0x7ff7b46d772c
arr[2]=51, 0x7ff7b46d7728
*ptr=71, 0x7ff7b46d7730
arr[3]=61, 0x7ff7b46d772c
*ptr=81, 0x7ff7b46d7734
arr[4]=71, 0x7ff7b46d7730
程式碼2:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int arr[5]={31,17,33,22,16};
int i,*ptr=arr;
for(i=0;i<5;i++){
*(ptr++)=*ptr+10;
//*ptr=*(ptr++)+10;
printf("*ptr=%d,\t%p\n",*ptr,ptr);
printf("arr[%d]=%d,\t%p\n\n",i,arr[i],&arr[i]);
}
return 0;
}
Output
*ptr=17, 0x7ff7bacf8724
arr[0]=41, 0x7ff7bacf8720
*ptr=33, 0x7ff7bacf8728
arr[1]=27, 0x7ff7bacf8724
*ptr=22, 0x7ff7bacf872c
arr[2]=43, 0x7ff7bacf8728
*ptr=16, 0x7ff7bacf8730
arr[3]=32, 0x7ff7bacf872c
*ptr=0, 0x7ff7bacf8734
arr[4]=26, 0x7ff7bacf8730
補充說明:
照我以前學過的*ptr++應該是整行算式算完才指向下一個位址啊
所以照理說
*(ptr++)=*ptr+10;
*ptr=*(ptr++)+10;
這兩行的結果應該要相同
結果跑出來不一樣....
我上網找到的資料聽說是跟IDE或編譯器有關?
但我看不太懂,希望版上高手可以提點一下
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 103.232.137.185 (臺灣)
※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1650041528.A.B1F.html
推 d630200x: 十三戒第八04/16 03:11
→ Lipraxde: 板上搜尋 "++"、"--",其實應該是每年都有人問XD04/16 08:08
→ steve1012: 為啥一直有人要這樣寫….04/16 13:43
推 asas1asas200: 你在兩個 sequence point 中修改同一個變數兩次04/16 23:23
非常感謝大家的指點!
各位高手貼的文章我都努力看完了!看來是Sequence point中變數改變兩次,導致Undefine
d behavior
(雖然我只學過一點點C,而關於定義++的左右值、順序等等好像都是在C++的標準陸續出現,
所以我整天都在了解其中的奧妙。)
(因為是自學,以前也沒想過要看C的標準…)
不過版上的高手著實為我開了許多扇窗!雖然我為我的閱讀能力感到悲傷QQ
※ 編輯: lybercydia (1.160.177.150 臺灣), 04/17/2022 00:32:14
※ 編輯: lybercydia (1.160.177.150 臺灣), 04/17/2022 00:37:49