高分!!!!有关VC++6.0中自加自减的问题

发布时间:2024-05-18 00:37 发布:上海旅游网

问题描述:

代码为:
int a=3;
cout<<a<<a++<<endl;
int b=3;
cout<<b++<<b<<endl;
int c=3;
printf("%d,%d",c,c++);
int d=3;
printf("%d,%d",++d,d);

运行结果分别是:43
43
3,3
4,3
问题就是为什么第三行出来的是3,3而不是4,3 根据其他的结果分析VC++函数的求值顺序应该是是从右到左的啊 为什么对c的计算是从左到右而对d的计算是从右到左呢? 很大的困惑 希望有高人给出解释
系统是WINDOWS XP SP2
代码第四行应为cout<<++b<<b<<endl;
笔误

问题解答:

前缀自加和后缀自加是不同的,前缀自加是先自加后使用,比如printf("%d,%d",++d,d);在这里虽然计算时是从右到左,但计算到++d时,电脑是明确的先计算出d的值再使用的,而后缀自加就使用了再加的,因此 printf("%d,%d",c,c++); 在编译的结果后printf函数里面使用的都是一个值就是3,因为先使用吗,这是编译器处理的结果。你只能问当初设计这个编译器的人。
(为什么对c的计算是从左到右)这话问错了,并不是从左到右。不信你用这个试试,
printf("%d,%d,%d,%d,%d",c,c++,c++,c++,c++);
输出结果都是一样的3,3,3,3,3
编译器的事,自己编程注意一点就是了

printf("%d,%d",c,c++);
printf函数是按照指定字符串给出的格式格式化输出数据的,所以自左向右输出。
这个问题的关键是:C++重载了<<运算符,在cout<<a<<a++<<endl;
并且operator<<返回ostream&对象,
先调用operator<<(a++),在调用operator<<(a),至于为什么a++以后在输出a的值变为3,我想应该是在调用过程中,编译器先把a放到栈当中,然后在operator<<(a++)完成之后a的值仍未原来的3

第一个结果是43我还真的不是很明白。
对于第三个,其实这个是和编译器相关的,
++在后面一般理解为先执行后计算,
++在前面一般理解为先计算后执行的。

不过在实际编程中不推荐这样写,会造成理解困难。

很简单的解释,cout读参数是从右往左读,而printf是从左往右读

主要是因为cout<<是从右到左运算,也就是说
第一行本来是先计算a++;但是++运算时先使用后加,那么后面一个的输出就是3
而前面的a实际上是++后的结果;
第二行中同理,cout<<++b<<b<<endl;是后面一个输出3,前面一个也输出4(先加后输出),但是输出后b就变成了4了
我回答的时候就怀疑你错了 呵呵,
第3行输出:第一个当然是3,第二个是先输出后 加
第四行输出,不大好说,我也不大确定了因为我觉得应该是输出 4,4 才对

第一行结果说明:

int a=3;
cout<<a<<a<<a++<<a<<a++<<a<<a++<<endl;
cout 函数运算顺序是从右向左的,每当遇到"<<"时,"<<var" var运算顺序为从左到右.
cout 函数运算顺序是从右向左运算结果依次存储当反指到 cout时一起输出.
所以上面的运算为: 6 6 5 5 4 4 3
--------------------------------------------------------
第三行结果说明:

使用printf函数时还要注意一个问题,那就是输出表列中的求值顺序。不同的编译系统不一定相同,可以从左到右,也可从右到左。Turbo C是按从右到左进行的。请看下面两个例子:

例1:
main(){
int i=8;
printf("%d %d %d %d %d %d ",++i,--i,i++,i--,-i++,-i--);
}
运行结果
8 7 7 8 -7 -8

例2:
main(){
int i=8;
printf("%d ",++i);
printf("%d ",--i);
printf("%d ",i++);
printf("%d ",i--);
printf("%d ",-i++);
printf("%d ",-i--);
}
运行结果:
9 8 8 9 -8 -9

这两个程序的区别是用一个printf语句和多个printf 语句输出。但从结果可以看出是不同的。为什么结果会不同呢?就是因为printf函数对输出表中各量求值的顺序是自右至左进行的。在第一例中,先对最后一项“-i--”求值,结果为-8,然后i自减1后为7。 再对“-i++”项求值得-7,然后i自增1后为8。再对“i--”项求值得8,然后i再自减1后为7。再求“i++”项得7,然后i再自增1后为8。 再求“--i”项,i先自减1后输出,输出值为7。 最后才求输出表列中的第一项“++i”,此时i自增1后输出8。

但是必须注意,求值顺序虽是自右至左,但是输出顺序还是从左至右,因此得到的结果是上述输出结果。

热点新闻