A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 星河鹭起 于 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

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

10 个回复

倒序浏览
本帖最后由 周宇华 于 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. }
复制代码
回复 使用道具 举报
  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 可能和编译器有关

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

但是++的优先级高于乘法,乘法应该是最后算的把?
回复 使用道具 举报
星河鹭起 发表于 2014-4-15 23:31
但是++的优先级高于乘法,乘法应该是最后算的把?

我觉得你是不是应该这样理解   k++和++k在传参数的时候变动过值     而在++k和k++代入运算前在参数哪里变成了常量值之后传给了x   y所以运算的时候直接就是5和7而不是k++和++k了   这个只是我得个人理解  对不对我也不知道
回复 使用道具 举报
我的编译器运行竟然是36 :funk:  狠迷糊  上网看到一篇很早以前的帖子   希望能帮上忙 :)

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

链接http://blog.csdn.net/bingxuewujian/article/details/6728396
回复 使用道具 举报
是这样的,
自增(自减)表达式作为实参表达式时,它的计算方法与作为普通语句的运算结果是完全不同。因为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

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

回复 使用道具 举报
程序猿-2014 发表于 2014-4-15 23:39
我觉得你是不是应该这样理解   k++和++k在传参数的时候变动过值     而在++k和k++代入运算前在参数哪里变 ...

是先变动值,然后再传递实参,但是如果是5和7的话,那结果就是35了,并不是42了。。
回复 使用道具 举报
星河鹭起 发表于 2014-4-16 00:07
是先变动值,然后再传递实参,但是如果是5和7的话,那结果就是35了,并不是42了。。 ...

是啊    我运行的结果就是35   
回复 使用道具 举报
其实就是个先赋值再运算,或先运算再赋值的问题,关键是看程序运行的环境,也就是编译器的设计原理。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马