多个“++”在变量和指针中工作

2024-01-29

这就是我认为的++操作员做

  1. a++; // a+=1 after calculating this line
  2. ++a; // a+=1 before calcuating this line

我正在尝试研究指针,我认为我误解了一些东西。

int a=10;
int arr[3]={0,1,2};
int *ptr;
ptr=arr;

printf("%d,%d,%d,%d\n",a++,a++,++a,++a);
printf("%d,%d,%d\n", ptr[0],ptr[1],ptr[2]);
printf("%d,%d,%d,%d,%d,%d", * ptr++, ( * ptr)++, ++ * ptr, ++( * ptr), *++ptr, * ptr);

我预计输出是:

12, 12, 12, 12
0,1,2
3,3,3,3,3,3,3

但事实并非如此。原来是这样的:

13,12,14,14
0,1,2
4,3,2,2,2,2

为什么是这样?


您不应该对函数的参数进行多次增量操作..因为它们的计算顺序是不明确的。此类代码的结果是未定义的。

意义:printf("%d,%d,%d,%d\n",a++,a++,++a,++a);应该写成

a++; a++;
++a; ++a;
printf("%d, %d, %d, %d\n", a, a, a, a);

首先尝试解决这个问题,看看结果是否仍然令人困惑。

更一般地说,一对之间应该只有一个增量序列点。 http://en.wikipedia.org/wiki/Sequence_point

Edit:克里斯是对的,在不知名的地方写四个增量是没有意义的。为了更好地回答你的问题:对于一个函数void f(int) and void g(int), with int a=0,

f(++a) = f(1);
f(a++) = f(0);
g(++a, ++a) = g(???); // undefined!

因此,函数的参数最多递增一次。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多个“++”在变量和指针中工作 的相关文章

随机推荐