搜索
查看: 2118|回复: 8

有两个问题。。。

[复制链接]
发表于 2012-9-15 13:31:59 | 显示全部楼层 |阅读模式
8啊哈币

截图20120915131813.png
上面的int SQ(int);中的(int)是什么意思?

还有,
宏.png

以下是我看到的分析:
在使用函数的例子中,函数调用是把实参i值传给形参y后自增1。然后输出函数值。因而要循环5次。输出1~5的平方值。而在使用宏的例子中,宏调用时,只作代换。SQ(i++)被代换为((i++)*(i++))。在第一次循环时,由于i等于1,其计算过程为:表达式中前一个i初值为1,然后i自增1变为2,因此表达式中第2个i初值为2,两相乘的结果也为2,然后i值再自增1,得3。在第二次循环时,i值已有初值为3,因此表达式中前一个i为3,后一个i为4,乘积为12,然后i再自增1变为5。进入第三次循环,由于i 值已为5,所以这将是最后一次循环。计算表达式的值为5*6等于30。i值再自增1变为6,不再满足循环条件,停止循环。从以上分析可以看出函数调用和宏调用二者在形式上相似,在本质上是完全不同的。


我能理解上面这段文字,但是,我试了一下,结果是1,9,25。即1,3,5的平方。可按上面所说,应该是2,12,30啊。。。
如果是编译器的问题,那么又是怎么得到1,9,25的呢?

源代码在这。。。http://www.cnblogs.com/wangkangluo1/archive/2011/07/11/2103258.html 话说挺不错的。。。

另外字有点多,希望大家能耐心看完哈~
谢谢~

分析.png

最佳答案

查看完整内容

第一个问题。我们从函数原型谈起。以你问题中的函数为例, int SQ(int); 第一个 int 描述函数返回值的数据类型(大多数函数返回值一般是整型或者没有返回值 void) 第二个 int 表示函数 SQ( ) 调用的参数类型 有关函数原型的更详细说明,请自行百度Google或者图书馆查询
 楼主| 发表于 2012-9-15 15:21:38 | 显示全部楼层
周一就要上课,拖个一天我就得下周末来看了。。。
发表于 2012-9-15 13:32:00 | 显示全部楼层
第一个问题。我们从函数原型谈起。以你问题中的函数为例,
      int SQ(int);
     第一个 int 描述函数返回值的数据类型(大多数函数返回值一般是整型或者没有返回值 void)
     第二个 int 表示函数 SQ( ) 调用的参数类型

有关函数原型的更详细说明,请自行百度Google或者图书馆查询
     
 楼主| 发表于 2012-9-15 13:53:39 | 显示全部楼层
20分钟了,0查看。。。
发表于 2012-9-15 15:49:41 | 显示全部楼层
这两个问题,哥可以帮你解答,稍晚点,再看吧。。
发表于 2012-9-15 16:46:47 | 显示全部楼层
本帖最后由 Wuya 于 2012-9-23 23:29 编辑

第二个问题。先简单了解几个术语。
     完整表达式:它不是一个更大表达式的子表达式。
                       如 y = ( i++ ) + ( i++ )*2 是完整表达式,

                                   而( i++ ) + ( i++ )*2 是它的一个子表达式。
     副作用:它是对数据对象的修改。
                 如语句:x = 2; 副作用是计算 x 的值等于 2 。
     顺序点:它是程序执行中的点,

                         它使所有在它前面的副作用都被计算且同一个数据对象只被修改一次。
                 如一个分号。一个完整表达式。

现在,讨论你的问题。
由于 SQ( i++ ) 被替换后的表达式 ( ( i++ )*( i++ ) ) 是一个完整表达式。
所以( ( i++ )*( i++ ) ) 是一个顺序点。

这样,由于副作用的存在,顺序点保证所有副作用被计算。
      第一个副作用是 对 ( ( i++ )*( i++ ) ) 求值( 1 * 1 ),
      第二个副作用是第一个自增量( i = 2 ),
      第三个副作用是第二个自增量( i = 3 ).
最后,结果和你得到的一样!1 ,9 , 25。




请参考这篇关于顺序点的博客文章
http://blog.csdn.net/scorpio16/article/details/1556235




 楼主| 发表于 2012-9-21 22:26:46 | 显示全部楼层
已经下周了~
发表于 2012-9-29 23:09:22 | 显示全部楼层
另外说下,我用另一个编译器,结果是正确的

:正在编译并连接......
C:\Program Files\集成学习环境(C语言)4.2\bin>tcc.exe -epractice.exe -IINCLUDE -LLIB turboc.c .\LIB\ExtGraph.lib   
Invalid keyboard code specified
Turbo C  Version 2.0  Copyright (c) 1987, 1988 Borland International
turboc.c:
Turbo Link  Version 2.0  Copyright (c) 1987, 1988 Borland International

        Available memory 396424


1.jpg
发表于 2012-10-5 17:47:57 | 显示全部楼层
确定了是编译器的问题 在某本教材上找到了解释:
带入参数时,不同的编译器处理方法可能不一样,有些从左到右计算值,有些从右到左。
上面这个就是类似的问题。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

广播台
特别关注
快速回复 返回顶部 返回列表