黑马程序员技术交流社区

标题: 关于论坛看到一片关于结果为什么是是36的帖子中问题的一... [打印本页]

作者: 星河鹭起    时间: 2014-4-15 22:05
标题: 关于论坛看到一片关于结果为什么是是36的帖子中问题的一...
本帖最后由 星河鹭起 于 2014-4-15 22:07 编辑

今天在论坛上看到一片帖子,关于以下程序结果为什么是36,帖子地址为:http://bbs.itheima.com/thread-114278-1-1.html
其中有位同学也回答了,但是我一直想不明白,而且我用VC和linux都试了,结果都是42.
程序如下:
#include<stdio.h>
int fun(int x,int y){
return x*y;
}

int main(void){
int k=5;
printf("%d",fun(k++,++k));
return 0;
}
后来在MJ学习IOS的3群跟一位基友探讨了下,我觉得结果应该还是42,分析如下,如有错误的地方还请大神们指正,嘿嘿:
首先,参考百度百科关于算术优先级 http://baike.baidu.com/link?url=SiCLO7NMm99llCQ3YU4jKyTo3m-pr-mGg6uoMBl739J8E3Jag0jyumwaXC8cCCZ-。按照C语言的规则,++优先级高于*,并且++是从右到左开始运算。
因此我认为程序中调用fun函数时,先运算k++和++k,最后才返回x*y,由于从右往左,因此先运算++k,结果为6,然后再运行k++,因为++的优先级高于*,因此这时候k++结果还是会加1,变成了7,最终的结果就是返回6*7,结果是42;我觉得并不是36.

如果有不对的地方,还请各位大神指正,非常感谢。:D
作者: 周宇华    时间: 2014-4-15 22:50
本帖最后由 周宇华 于 2014-4-15 22:52 编辑

我用Xcode运行了下面的程序,没有42的情况。难道和编译器还有关?
  1. #include<stdio.h>
  2. int fun(int x,int y){
  3.     return x*y;
  4. }

  5. int main(void){
  6.     int k=5;
  7.     printf("%d\n",fun(k++,++k)); // 打印35
  8.     k = 5;
  9.     printf("%d\n",fun(++k,k++)); // 打印36
  10.     return 0;
  11. }
复制代码

作者: Dmajor    时间: 2014-4-15 23:07
  1. #include<stdio.h>
  2. int fun(int x,int y){
  3. return x*y;
  4. }

  5. int main(void){
  6. int k=5;
  7. printf("%d",fun(k++,++k));   //打印 42
  8. k=5;
  9. printf("%d",fun(++k,k++));    //打印 35
  10. return 0;
  11. }
复制代码


我用的vs c++调试的也是42 可能和编译器有关


作者: 程序猿-2014    时间: 2014-4-15 23:26
这道题很有迷惑性的   不知道你们的答案哪来的   我用Xcode运行的结果却是35    问题我觉得应该是在这个K++上
首先K++是先运算后赋值   所以这个k++的这个值从来就没变过   变得只是++k的值   所以返回时时5*7   结果就是35了
作者: 星河鹭起    时间: 2014-4-15 23:31
程序猿-2014 发表于 2014-4-15 23:26
这道题很有迷惑性的   不知道你们的答案哪来的   我用Xcode运行的结果却是35    问题我觉得应该是在这个K++ ...

但是++的优先级高于乘法,乘法应该是最后算的把?
作者: 程序猿-2014    时间: 2014-4-15 23:39
星河鹭起 发表于 2014-4-15 23:31
但是++的优先级高于乘法,乘法应该是最后算的把?

我觉得你是不是应该这样理解   k++和++k在传参数的时候变动过值     而在++k和k++代入运算前在参数哪里变成了常量值之后传给了x   y所以运算的时候直接就是5和7而不是k++和++k了   这个只是我得个人理解  对不对我也不知道
作者: 从┧靇┟开始    时间: 2014-4-15 23:53
我的编译器运行竟然是36 :funk:  狠迷糊  上网看到一篇很早以前的帖子   希望能帮上忙 :)

也是csdn上的(绝非广告:handshake)

链接http://blog.csdn.net/bingxuewujian/article/details/6728396
作者: 悠悠·漠漠    时间: 2014-4-16 00:01
是这样的,
自增(自减)表达式作为实参表达式时,它的计算方法与作为普通语句的运算结果是完全不同。因为C语言的函数执行过程是将函数实参表达式的值按照从右至左顺序入栈,入栈时就将实参表达式的值计算完毕,被调函数从入栈中取参数值使用,因此如果函数有多个参数,他们是按照从右至左的顺序计算。
举个例子就是
  1. #include <stdio.h>

  2. int main(void){
  3. int k=5;
  4. printf("%d %d",k,k++);
  5. return 0;
  6. }
复制代码
的输出是6 5而不是6 6

作者: 星河鹭起    时间: 2014-4-16 00:07
程序猿-2014 发表于 2014-4-15 23:39
我觉得你是不是应该这样理解   k++和++k在传参数的时候变动过值     而在++k和k++代入运算前在参数哪里变 ...

是先变动值,然后再传递实参,但是如果是5和7的话,那结果就是35了,并不是42了。。
作者: 程序猿-2014    时间: 2014-4-16 00:25
星河鹭起 发表于 2014-4-16 00:07
是先变动值,然后再传递实参,但是如果是5和7的话,那结果就是35了,并不是42了。。 ...

是啊    我运行的结果就是35   
作者: _Water    时间: 2014-4-16 00:51
其实就是个先赋值再运算,或先运算再赋值的问题,关键是看程序运行的环境,也就是编译器的设计原理。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2