我想请教各位高手关于自增(减)运算的一个问题

发布时间:2024-05-19 03:08 发布:上海旅游网

问题描述:

#include<stdio.h>
void main()
{
int a,k=4,k1,k2,k3,k4;
a=(k1=k++)+(k2=k++)+(k3=++k)+(k4=k++);
printf("a=%d k=%d k1=%d k2=%d k3=%d k4=%d",a,k,k1,k2,k3,k4);
}a=18,k=8,k1=k2=4,k3=k4=5.
我想问一下为何k=8,我认为如果按前后缀之分,当(k1=k++)为4后,k为5,当(k2=k++)为4后,k为6,以此类推k=8,但我有疑惑为何随后的式子(k2=k++),不引用k=5为其初始量(k3=++k)不引用k=6为其初始量。...
是否与编译器环境不同有关?
希望各位高手指点迷津,多谢各位!!
我还是有些疑惑,在计算机对算式进行扫描时,如果先扫描(k1=k++),k1自然是4,而此次运算结束后k为何没有成为5,而是保留4继续参与下个算式的运算,进而出现4,4,5,5的结果,但我认为实际上k已经发生了变化,否则k最终不会是8.按你的说法k++运算时仍看做k计算,而我认为在(k1=k++)后k已经发生自加为5,为何不用5作为(k2=k++)的初始量?,情高手为我指点迷津,多谢了!!

问题解答:

k1=k++ k=4 k1=4
k2=k++ k=4 k2=4
k3=++k k=5 k3=5
k4=k++ k=5 k4=5
C系统中的运算都是一样的,k++先计算后自加,++K先自加后计算
也就是说K++运算的时候仍看做K来计算,计算结束后在进行K+1的自加
++K先把K=K+1进行自加,把自加的结果代入算式中

这个的确是个难题,在不同的编译器下结果是不同的,我就试了两种(我就装了这两种)
一.在TC下面,a=20,k=8,其它都为5;
二.在VC6.0下面运行和上面一样;
第一种情况我也没有办法解释,还请高手指点,对第二种情况我想可能是这样:k1,k2,k3,k4这四个赋值运算优先级一样,应该是同时运算,此时k++运算后形成k的中间结果并未赋给k,而++k后,形成的k的中间结果直接赋给k了,这样k1=k;k2=k;k3=k+1;k4=k+1(此中k为k3式中++k后的结果);最后k的中间结果运算形成k的最终值

这样的表达式在不同的C系统中会有不同的解释,在实际的编程过程中,绝对不应该使用这类表达式。

如果此时你有《C程序设计》(第三版),那就太幸运了!你可以看看第58~59页。

热点新闻