注册 登录
编程论坛 C++教室

[求助]请教关于调用函数fun (i,++i);的问题

八宝周 发布于 2007-04-19 09:25, 815 次点击

小弟初学c++,在教程里(谭浩强编的c++)看到一个问题十分困惑,请高手指教,谢谢!
以下是教程里的原文:
“例如,若变量i的值为3,有以下函数调用:
fun(i,++i);
如果按自左至右的顺序求实参的值,则函数调用相当于fun(3,4),若按自右至左的顺序求实参的值,则相当于fun(3,3)。许多c++系统(例如Visual C++和GCC)是按自右至左的顺序求值的。”

为什么按自右至左的顺序求值就是fun(3,3)呢,能不能写个代码体现一下?

8 回复
#2
aipb20072007-04-19 09:58

这不是自右向左的顺序问题,这是个,(逗号)运算法则。
比如(a,b)a,b分别为表达式,先计算a,然后运算结果暂存,再运算b,整个表达式的结果由b决定。

所以
void f(int i,int j){
cout << i << "\t" << j << endl;
}


int a = 3;
f(a,++a);

输出结果为 4,4。

#3
PcrazyC2007-04-19 17:14
二楼错了,这个地方只是参数分隔符,并不是什么逗号运算符

楼主怎么说自右向左求值的时候就是fun(3,3)啊,应该是fun(4,4)吧,是不是看错了
#4
yuyunliuhen2007-04-19 18:11

这本书
VC++6.0 :
#include<iostream>
using namespace std;
int f(int i,int j)
{
cout<<i<<" "<<j<<endl;
return 0;
}

int main()
{
int i=3,j=3;
// f(i,++i); //输出 4 4
f(i,i++); //输出 3 3
system("pause");
return 0;

}

DEV C++ :
#include<iostream>
using namespace std;
int f(int i,int j)
{
cout<<i<<" "<<j<<endl;
return 0;
}

int main()
{
int i=3,j=3;
f(i,++i); //输出 4 4
// f(i,i++); //输出 4 3
system("pause");
return 0;

}
VC 和 GCC的法则不一样吧

#5
yuyunliuhen2007-04-19 18:26

“例如,若变量i的值为3,有以下函数调用:
fun(i,++i);
如果按自左至右的顺序求实参的值,则函数调用相当于fun(3,4)
若按自右至左的顺序求实参的值,则相当于fun(3,3)。


这话有待研究.

[此贴子已经被作者于2007-4-19 18:29:20编辑过]

#6
游乐园2007-04-19 18:58

应该和编译器的执行顺序有关了

fun(i,++i); //从左到右 肯定是 fun(3,4)了 而从右到左是fun(4,4) 不应该有fun(3,3)的情况发生吧

#7
song42007-04-19 20:09

同上
与平台有关
不过,想知道规定的是什么样
用DEV测试
但是最好别写这些'小聪明'的程序

#8
aipb20072007-04-19 23:24
才把dev-cpp装好,弄了一哈,还可以!

只是没了熟悉的辅助功能,还有它的调试和自动缩进不好用啊!

用dev-cpp的多不?
#9
八宝周2007-04-22 15:02
谢谢各位,大致明白其中的意思了
1