初学者C数组和增量
请原谅我的业余爱好,但我真的很难理解基本的递增机制。评论正确吗初学者C数组和增量,c,arrays,increment,C,Arrays,Increment,请原谅我的业余爱好,但我真的很难理解基本的递增机制。评论正确吗 #include <stdio.h> main() { int a[5]={1,2,3,4,5}; int i,j,m; i = ++a[1]; // the value of a[1] is 3. i=3 j = ++a[1]; /* because of the previous line a[1]=3 and now a[1]=4? but not in the line defining i? */ m =
#include <stdio.h>
main()
{
int a[5]={1,2,3,4,5};
int i,j,m;
i = ++a[1]; // the value of a[1] is 3. i=3
j = ++a[1]; /* because of the previous line a[1]=3
and now a[1]=4? but not in the line defining i? */
m = a[i++]; /* i retained the value of 3 even though the value of a[1] has changed
so finally i++ which is incremented in printf()? */
printf("%d, %d, %d", i,j,m);
}
#包括
main()
{
int a[5]={1,2,3,4,5};
int i,j,m;
i=++a[1];//a[1]的值是3。i=3
j=++a[1];/*因为前一行a[1]=3
现在a[1]=4?,但不在定义i的直线上*/
m=a[i++];/*即使a[1]的值已更改,我仍保留了3的值
那么最后是在printf()中递增的i++吗*/
printf(“%d,%d,%d”,i,j,m);
}
我可以回答我自己的问题,但到目前为止,我已经愚弄了自己好几次了。
I=++a[1]
将a[1]
的值增加到3
,而+a[1]
的结果即3
将分配给I
j=++a[1]
将a[1]
的值增加到4
,并且++a[1]
的结果即4
将分配给j
m=a[i++]
将a[3]
的值(因为i
现在是3b)分配给m
,该值为4
,i
将增加1
。现在i
变成4
i=++a[1]
将a[1]
的值增加到3
,并且++a[1]
的结果即3
将被分配给i
j=++a[1]
将a[1]
的值增加到4
,并且++a[1]
的结果即4
将分配给j
m=a[i++]
将a[3]
的值(因为i
现在是3b)分配给m
,该值为4
,i
将增加1
。现在,i
变成了4
使用++
和--
运算符要记住的是表达式有结果和副作用。++i
的结果是i
加上1
的原始值。++i
的副作用是将1
添加到i
中存储的值中
因此,如果i
最初是0
,那么在表达式中
j = ++i
j
获取0+1
的结果(i
的原始值加上1
)。作为副作用,1
被添加到当前存储在i
中的值中。因此,在计算该表达式之后,i
和j
都包含1
++
的后缀版本略有不同;i++
的结果是i
的原始值,但副作用是相同的-1
被添加到i
中存储的值中。因此,如果i
最初是0
,那么
j = i++;
j
获取i
(0
)的原始值,并将1
添加到i
中存储的值中。在这个表达式之后,j
是0
,i
是1
重要-未指定执行j
赋值和i
副作用的确切顺序<在分配j
之前,不必更新code>i,反之亦然。因此,++
和--
的某些组合(包括但不限于i=i++
、i++*i++
、a[i++]=i
和a[i]=i++
)将导致未定义的行为;结果将不可预测地发生变化,这取决于平台、优化和周围的代码
那么,让我们想象一下,您的对象在内存中的布局如下:
+---+
a: | 1 | a[0]
+---+
| 2 | a[1]
+---+
| 3 | a[2]
+---+
| 4 | a[3]
+---+
| 5 | a[4]
+---+
i: | ? |
+---+
j: | ? |
+---+
m: | ? |
+---+
首先我们评估
i = ++a[1];
++a[1]
的结果是a[1]
的原始值加1-在本例中为3
。副作用是更新a[1]
中的值。在此语句之后,对象现在看起来如下所示:
+---+
a: | 1 | a[0]
+---+
| 3 | a[1]
+---+
| 3 | a[2]
+---+
| 4 | a[3]
+---+
| 5 | a[4]
+---+
i: | 3 |
+---+
j: | ? |
+---+
m: | ? |
+---+
现在我们执行
j = ++a[1];
相同的交易-j
获得a[1]
加1的值,副作用是更新a[1]
。经过评估,我们有
+---+
a: | 1 | a[0]
+---+
| 4 | a[1]
+---+
| 3 | a[2]
+---+
| 4 | a[3]
+---+
| 5 | a[4]
+---+
i: | 3 |
+---+
j: | 4 |
+---+
m: | ? |
+---+
最后,我们有
m = a[i++];
i++
的结果是3
,因此m
获取存储在a[3]
中的值。副作用是将1
添加到i
中存储的值中。现在,我们的物体看起来像
+---+
a: | 1 | a[0]
+---+
| 4 | a[1]
+---+
| 3 | a[2]
+---+
| 4 | a[3]
+---+
| 5 | a[4]
+---+
i: | 4 |
+---+
j: | 4 |
+---+
m: | 4 |
+---+
使用
++
和-->
运算符需要记住的是,表达式有结果和副作用。++i
的结果是i
加上1
的原始值。++i
的副作用是将1
添加到i
中存储的值中
因此,如果i
最初是0
,那么在表达式中
j = ++i
j
获取0+1
的结果(i
的原始值加上1
)。作为副作用,1
被添加到当前存储在i
中的值中。因此,在计算该表达式之后,i
和j
都包含1
++
的后缀版本略有不同;i++
的结果是i
的原始值,但副作用是相同的-1
被添加到i
中存储的值中。因此,如果i
最初是0
,那么
j = i++;
j
获取i
(0
)的原始值,并将1
添加到i
中存储的值中。在这个表达式之后,j
是0
,i
是1
重要-未规定执行j
赋值和i
副作用的确切顺序