大虾都来看看

rw99yy 2007-05-30 01:30:43
int k = 0;
int arr[]={0,1,2,3,4,5};
int *ptr = arr;

//这里我的理解是arr[1] = arr[0]
//因为=从右向左运算 右边:a[0],但做了++操作,左边就应该指向a[1]
//此时数组的值没变
*(ptr++)=*(ptr++);

--------------------------------------

//我另外写了个函数验证
//可实际情况却为arr[0] = arr[1],这次是从左往右了
arr[k++] = fun(arr[k++],arr);

int fun(int k,int arr[]){
printf("%d\n",arr[k]);
return arr[k];
}
...全文
641 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
rw99yy 2007-05-31
  • 打赏
  • 举报
回复
不懂的就不要在那里批评,我也只是来讨论。
再次说一下:我不会写这样的代码,我也写不出这样的代码。
我只是把这个拿出来给大家讨论讨论,
最反感那些一来就批评的人。

这个代码既然在编译执行不会有错,就说明c标准的定义不明确,导致有不同的理解。
yjdlut 2007-05-30
  • 打赏
  • 举报
回复
没上机试试吗?我分析的认为结果是002244,不知道对不对
huashizhixin 2007-05-30
  • 打赏
  • 举报
回复
*(ptr++)=*(ptr++);这样的语句,不好说什么,用来考试唬人还是可以的,其他的没多大的作用;*ptr=*ptr;ptr++;ptr++;没意思.....
dai_weitao 2007-05-30
  • 打赏
  • 举报
回复
喝高了吧,没听懂一句话
milksea 2007-05-30
  • 打赏
  • 举报
回复
在标准上找关键字side effect和sequence point,仔细读。
milksea 2007-05-30
  • 打赏
  • 举报
回复
因为赋值没有序列点,而++运算又是有副作用的,所以这个赋值的结果是未定义的。去看C99标准。
CHROX 2007-05-30
  • 打赏
  • 举报
回复
C++标准上说 "The result of the postfix ++ operator is the value of the operand. After the result is obtained, the value of the operand is incremented."但是没有具体解释这个“After”,可能是编译器具体实现相关的吧。上面是VC7的反汇编结果。
CHROX 2007-05-30
  • 打赏
  • 举报
回复
这样的问题还是看反汇编代码比较直观

*(ptr++)=*(ptr++);
mov eax,dword ptr [ptr] ;int temp1=ptr
mov ecx,dword ptr [ptr] ;int temp2=ptr
mov edx,dword ptr [ecx] ;int temp3=*ptr
mov dword ptr [eax],edx ;*ptr=temp3 //*ptr=*ptr
mov eax,dword ptr [ptr] ;int temp4=ptr
add eax,4 ;temp4 +=4
mov dword ptr [ptr],eax ;ptr=temp4 //ptr++
mov ecx,dword ptr [ptr]
add ecx,4
mov dword ptr [ptr],ecx ; //ptr++

所以*(ptr++)=*(ptr++);就相当于:
*ptr=*ptr;
ptr++;
ptr++;
最终数组什么也没更改,就是把指针变量改变了
对于编译器遇到表达式*(ptr++)=*(ptr++)时因为是后加运算符,在整个表达式*ptr=*ptr返回后再后加
rw99yy 2007-05-30
  • 打赏
  • 举报
回复
难道考试的时候 老师出了这样的题 你不做 你说这题垃圾
rw99yy 2007-05-30
  • 打赏
  • 举报
回复
我不是叫你们来批判代码的 我当然知道代码这样写不好
但是有人写出来了 编译器也认了 程序也执行了
我只是想知道有没人知道 不知道就不要说
我晕!
zycy 2007-05-30
  • 打赏
  • 举报
回复
这种代码是没有什么意义的
应为不同的编译环境下,对运算符的优先级别和结合性的定义是有细微差别的,尤其是结合性
所以,这个代码的结果在不同的平台运行结果是不一样的
前面有和你问题类似的帖子
这个东东没有讨论的意义,养成好的代码风格是比较重要的,写这种代码的人纯粹是显摆!!!
bargio_susie 2007-05-30
  • 打赏
  • 举报
回复
你就不能看牛人写的代码,看这样的人写的代码你不觉得浪费时间吗?还误入歧途。。。
  • 打赏
  • 举报
回复
晕,这样的代码.
哎,有什么样的结果就不要奇怪
rw99yy 2007-05-30
  • 打赏
  • 举报
回复
不是我写这样的代码 是我看到网上一道这样的题目
我想分析分析 我也觉得不能这样写代码
expter 2007-05-30
  • 打赏
  • 举报
回复
蛮混乱的。。。
ouyh12345 2007-05-30
  • 打赏
  • 举报
回复
ptr++;
k = *ptr;
ptr++;
*ptr = k;
ouyh12345 2007-05-30
  • 打赏
  • 举报
回复
*(ptr++)=*(ptr++);
--
不能写这样的代码,风格极差,很难阅读。
应该反省,为什么要这样做?拆开不行吗?
rw99yy 2007-05-30
  • 打赏
  • 举报
回复
解释一下
int k = 0;
int arr[]={0,1,2,3,4,5};
int *ptr = arr;

*(ptr++)=*(ptr++);

请问这个时候数组中的值应该是多少呢?
我觉得应该是 0 0 2 3 4 5
因为=运算从右往左 先右边 *(ptr++)其实就是*ptr = 0,然后是左边 因为右边做了++操作,所以 左边的 *(ptr++) 应该指向arr[1]
那么结果就应该是a[1] = a[0]
但是不是这样的
rw99yy 2007-05-30
  • 打赏
  • 举报
回复
不会看不懂吧
星羽 2007-05-30
  • 打赏
  • 举报
回复
LZ 是不是喝了酒
加载更多回复(1)

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧