请理解我还在学习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) 好吧,我和我的朋友就下面的代码进行了辩论。我们对它产生的输出有点困惑。有人可以澄清以下代码段的按引用调用和按值调用结果吗?
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 的情况下,该程序的结果输出。
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值指向堆栈中的一些随机内容。
#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已被交换; 为什么宏不按值调用?请通过解释结果帮助我.
我试图在这里理解这段代码:
#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.这是什么原因造成的?
我已经读过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吗?
我正在练习一些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
我将数组元素传递给函数.此函数为数组的每个元素添加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)