C++ 按名称呼叫(正常订单评估)

C++ 按名称呼叫(正常订单评估),c++,parameter-passing,pass-by-name,C++,Parameter Passing,Pass By Name,我有下面的代码(类似C语言)。我知道如何跟踪是否使用了按值传递或按引用传递,但也有按名称调用机制。有人能告诉我如何按姓名追踪电话吗 int x=12,y=10; void tswap(int pa, int pb) { int tmp; tmp=pa; pa=pb; pb=tmp; x=x+pa; x=x-pb; y++; printf("%d %d %d %d\n",pa,pb,x,y); } int main() { int a=4;

我有下面的代码(类似C语言)。我知道如何跟踪是否使用了按值传递或按引用传递,但也有按名称调用机制。有人能告诉我如何按姓名追踪电话吗

int x=12,y=10;
void tswap(int pa, int pb) {
   int tmp;
   tmp=pa;
   pa=pb;
   pb=tmp;
   x=x+pa;
   x=x-pb;
   y++;
   printf("%d %d %d %d\n",pa,pb,x,y);
}
int main() {
    int a=4;
    tswap(x,a);
    printf("%d %d %d\n",x,y,a);
    tswap(++x,++y);
    printf("%d %d %d\n",x,y,a);
    return 0;
}
如果使用传递值,则输出如下所示:

412411

4 11 4

1251213

P>12 13,4<P>P>一般C++不使用称呼。按名称调用表示函数的参数不在函数调用时计算。它的行为就像参数将被替换到函数体中一样

例如:

void foo(int a, int b) {
    int s = 0;
    for(int i=0; i<n; i++) {
        s += b;
    }
}
inline unsigned foo(unsigned a, unsigned b) {
    return a / b;
}
template<typename F>
int foo(int a, F b) {
    int s = 0;
    for(int i=0; i<a; i++) {
        s += b();
    }
}
bar
计算一次,并将结果提供给函数
foo

使用名称调用的语言可能会转换
foo(3,bar(7))

void foo() {
    int s = 0;
    for(int i=0; i<3; i++) {
        s += bar(7);
    }
}
如果你调用
a=foo(x,2)a=x/2a=x>>1

这甚至可以延伸到以下示例:

inline int foo(int a, int b) {
    if(a == 0) return 0;
    else return b;
}
现在编译器确实可以转换
x=foo(0,bar(17))
x=0因此从不调用函数
bar
。我认为只有在确保
bar
没有副作用的情况下,才会进行这种优化


虽然C++没有使用名称调用,但在C++中可以很容易地使用IDEM。只需给函数一个函数对象/指针即可

例如:

void foo(int a, int b) {
    int s = 0;
    for(int i=0; i<n; i++) {
        s += b;
    }
}
inline unsigned foo(unsigned a, unsigned b) {
    return a / b;
}
template<typename F>
int foo(int a, F b) {
    int s = 0;
    for(int i=0; i<a; i++) {
        s += b();
    }
}
模板
int foo(int a,F b){
int s=0;

for(int i=0;iC++没有按名称调用机制。(您可以通过让函数获取函数对象来模拟它。)当我运行这个程序时,我完全得到了你的输出。但是函数调用没有什么特别之处:所有的参数都是按值传递的。而且老实说,我从来没有听说过C++中的名字过关……名字的传递并不存在,它只是理论概念: