作者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://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1650041528.A.B1F.html
2F:推 d630200x: 十三戒第八04/16 03:11
4F:→ Lipraxde: 板上搜寻 "++"、"--",其实应该是每年都有人问XD04/16 08:08
5F:→ steve1012: 为啥一直有人要这样写….04/16 13:43
6F:推 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