标签: call-by-value

C++ 11 rvalue and move:遗留代码可以避免复制吗?

请理解我还在学习C++ 11的移动和rvalue语义的概念.我的问题是遗留代码是否可以通过简单地使用C++ 11编译器和STL获得避免不必要的副本的免费午餐.

这是一个非常简单的例子.此代码为给定字符串构建一个简单的字符频率表.例如,"apple"应该返回{('a', 1), ('e', 1), ('l', 1), ('p', 2)}.正如您将看到的,我只是使用向量作为值.

typedef std::tuple<char, int> Frequency;
typedef std::vector<Frequency> Frequencies;

Frequencies buildFrequenciesTable(std::string w) {
  char table['z' - 'a' + 1] = { 0, };
  std::for_each(w.cbegin(), w.cend(), [&table](char c) {
    ++table[::tolower(c) - 'a'];
  });

  Frequencies freqs;
  for (size_t i = 0; i < 'z' - 'a' + 1; ++i) {
    if (table[i] != 0)
      freqs.push_back(tuple<char, int>((char) ('a' + i), table[i]));
  }
  return freqs; // Q1: Is vector get copied?
}

int …
Run Code Online (Sandbox Code Playgroud)

c++ rvalue-reference move-semantics c++11 call-by-value

2
推荐指数
1
解决办法
350
查看次数

按引用调用和按值调用结果

好吧,我和我的朋友就下面的代码进行了辩论。我们对它产生的输出有点困惑。有人可以澄清以下代码段的按引用调用和按值调用结果吗?

program params;
    var i: integer;
    a: array[1..2] of integer;

    procedure p(x,y: integer);
    begin
        x := x + 1;
        i := i + 1;
        y := y + 1;
    end;

begin
    a[1] := 1;
    a[2] := 2;
    i := 1;
    p( a[i],a[i] );
    output( a[1],a[2] );
end.
Run Code Online (Sandbox Code Playgroud)

在参数通过 value-result 和通过引用传输到过程 p 的情况下,该程序的结果输出。

pascal pass-by-reference call-by-value

2
推荐指数
1
解决办法
3347
查看次数

为什么指针的值仍为20?

void func(char *p)
{
    int q = 13;
    p = &q;
    printf("%d\n", *p);
}

void main(void)
{
    int var = 20;
    int *p = &var;

    printf("%d\n", *p);

    func(p);

    printf("%d\n", *p);
}
Run Code Online (Sandbox Code Playgroud)

为何函数退出时指针仍为20?我跳到func()结尾时,在其中修改了指针,最后printf(),该*p值指向堆栈中的一些随机内容。

c pointers call-by-value

2
推荐指数
1
解决办法
78
查看次数

为什么宏功能不是按值调用?

#include<stdio.h>
#define exch(A,B) {int t=A;A=B;B=t;}
int main(void)
{
    int a=1,b=4;
    exch(a,b);
    printf("%d\t%d\n",a,b);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

打印:a=4,b=1

在输出中,a和b已被交换; 为什么宏不按值调用?请通过解释结果帮助我.

c macros c-preprocessor call-by-value

1
推荐指数
1
解决办法
83
查看次数

按名称呼叫/按值呼叫

我试图在这里理解这段代码:

#include <iostream>
using namespace std;

#define mymult(a, b) a*b
inline int mymult1(int a, int b) {return a*b;}

int main() {
cout << "mymult(2+2, 3+3) = " << mymult(2+2, 3+3) << "\n";
cout << "mymult1(2+2, 3+3) = " << mymult1(2+2, 3+3) << "\n";
}
Run Code Online (Sandbox Code Playgroud)

mymult = 11,mymult1 = 24.我知道'#define实际上是通过名字调用而不是按值调用.但是,我很难理解为什么它返回的值是11 ......而不是24.这是什么原因造成的?

c++ inline callbyname c-preprocessor call-by-value

1
推荐指数
1
解决办法
232
查看次数

如果perl是逐个引用的,为什么会发生这种情况呢?

我已经读过perl在执行subrutines时使用call-by-reference.我制作了一段简单的代码来检查这个属性,但它的行为就像perl是按值调用:

$x=50;
$y=70;

sub interchange {
    ($x1, $y1) = @_;

    $z1 = $x1;
    $x1 = $y1;
    $y1 = $z1;

    print "x1:$x1 y1:$y1\n";
}

&interchange ($x, $y);

print "x:$x y:$y\n";
Run Code Online (Sandbox Code Playgroud)

这会产生以下输出:

$ perl example.pl
x1:70 y1:50
x:50 y:70
Run Code Online (Sandbox Code Playgroud)

如果参数以逐个引用的方式处理,x不应该等于x1而y等于y1吗?

perl pass-by-reference evaluation-strategy call-by-value

0
推荐指数
1
解决办法
312
查看次数

C代码:在递归调用中将表达式作为参数传递

我正在练习一些C问题遇到一个递归函数用表达式作为参数调用自身的场景.

Pow(double x, unsigned n){ 
  .....
  .....
  return Pow(x*x,n/2);
 }
Run Code Online (Sandbox Code Playgroud)

我的问题是,是否计算表达式(X*X,如在由值调用)时,参数被传递或执行此一惰性求即,不评价使用时为止.

以下是详细问题

查找调用Pow(5.0,12)的乘法次数?

Pow(double x, unsigned n) { 
     if(n==0)   return 1;
     if(n==1)   return x;
     if(n%2==0) return Pow(x*x,n/2);
     else      
     return Pow(x*x,n/2)*x;
}
Run Code Online (Sandbox Code Playgroud)

选项5,6,8,12

c recursion parameter-passing generic-programming call-by-value

0
推荐指数
1
解决办法
588
查看次数

通过值调用更改数组元素

我将数组元素传递给函数.此函数为数组的每个元素添加5.我也传递一个整数并向它添加5 ...即使它是一个'按值调用'函数,整数的值main()也不会改变(这是预期的)但是数组元素确实改变了......

我不知道怎么样和为什么?

#include <iostream>

using namespace std;

void change(int x[],int y);

int main()
{
    int sharan[]={1,2,3,4};
    int a=10;
    change(sharan,a);
    for(int j=0;j<4;j++)
    {
        cout<<sharan[j]<<endl;
    }
    cout<<endl<<"a is : "<<a;
    return(0);
}

void change(int x[],int y)
{
    for(int i=0;i<4;i++)
    {
        x[i]+=5;
    }
    y+=5;
}
Run Code Online (Sandbox Code Playgroud)

c++ arrays call-by-value

-3
推荐指数
1
解决办法
72
查看次数