我想知道当你只读取一个变量时它是否是传递引用的好方法,或者它是否应该总是作为一个值传递.
传递引用的示例:
$a = 'fish and chips';
$b = do_my_hash($a);
echo $b;
function &do_my_hash(&$value){
return md5($value);
}
Run Code Online (Sandbox Code Playgroud)
传值的示例:
$a = 'fish and chips';
$b = do_my_hash($a);
echo $b;
function do_my_hash($value){
return md5($value);
}
Run Code Online (Sandbox Code Playgroud)
哪个更好 ?例如,如果我要运行1000轮的循环?
循环示例:
for($i = 0 ; $i < 1000 ; $i++){
$a = 'Fish & Chips '.$i;
echo do_my_hash($a);
}
Run Code Online (Sandbox Code Playgroud) 我在C++中遇到了可选函数参数的问题
我要做的是编写带有可选参数的函数,该函数通过引用传递,这样我就可以用两种方式(1)和(2),但是(2)我真的不在乎什么是的价值mFoobar.
我试过这样的代码:
void foo(double &bar, double &foobar = NULL)
{
bar = 100;
foobar = 150;
}
int main()
{
double mBar(0),mFoobar(0);
foo(mBar,mFoobar); // (1)
cout << mBar << mFoobar;
mBar = 0;
mFoobar = 0;
foo(mBar); // (2)
cout << mBar << mFoobar;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但它崩溃了
void foo(double &bar, double &foobar = NULL)
Run Code Online (Sandbox Code Playgroud)
有消息:
error: default argument for 'double& foobar' has type 'int'
Run Code Online (Sandbox Code Playgroud)
没有函数重载可以解决它吗?
这2个代码有什么区别:
代码A:
Foo myFoo;
myFoo = createfoo();
Run Code Online (Sandbox Code Playgroud)
哪里
public Foo createFoo()
{
Foo foo = new Foo();
return foo;
}
Run Code Online (Sandbox Code Playgroud)
比.代码B:
Foo myFoo;
createFoo(myFoo);
public void createFoo(Foo foo)
{
Foo f = new Foo();
foo = f;
}
Run Code Online (Sandbox Code Playgroud)
这2个代码之间有什么区别吗?
java terminology parameter-passing pass-by-reference pass-by-value
可能重复:
Python:如何通过引用传递变量?
我的代码:
locs = [ [1], [2] ]
for loc in locs:
loc = []
print locs
# prints => [ [1], [2] ]
Run Code Online (Sandbox Code Playgroud)
为什么loc不参考元素locs?
Python:除非明确复制,否则所有内容都将作为引用传递[这不是真的吗?]
请解释.. python如何决定引用和复制?
更新:
怎么做 ?
def compute(ob):
if isinstance(ob,list): return process_list(ob)
if isinstance(ob,dict): return process_dict(ob)
for loc in locs:
loc = compute(loc) # What to change here to make loc a reference of actual locs iteration ?
Run Code Online (Sandbox Code Playgroud)
enumerate,没有它可能吗?简单地说,我有一个带有ArrayList参数的方法.在方法中,我修改ArrayList的内容,仅用于与方法返回的内容相关的目的.因此,我不希望作为参数传递的ArrayList完全受到影响(即不作为引用传递).
我尝试的一切都未能达到预期的效果.我需要做什么才能在方法中使用ArrayList的副本,但不能更改实际变量?
代码1
#include <stdio.h>
int f(int *a, int b)
{
b = b - 1;
if(b == 0) return 1;
else {
*a = *a+1;
return *a + f(a, b);
}
}
int main() {
int X = 5;
printf("%d\n",f(&X, X));
}
Run Code Online (Sandbox Code Playgroud)
考虑这个C代码.这里的问题是预测输出.从逻辑上讲,我得到31作为输出.(机器输出)
当我将return语句更改为
return f(a, b) + *a;
Run Code Online (Sandbox Code Playgroud)
我逻辑上得到37.(机器输出)
我的一个朋友说,在计算返回语句时
return *a + f(a, b);
Run Code Online (Sandbox Code Playgroud)
我们计算树的深度值,即*先f(a, b)调用然后调用,而在
return f(a,b) + *a;
Run Code Online (Sandbox Code Playgroud)
它在返回时被解析,即先f(a, b)被计算然后*a被调用.
通过这种方法,我尝试自己预测以下代码的输出:
代码2
#include <stdio.h>
int foo(int n) …Run Code Online (Sandbox Code Playgroud) 我有一个名为A的活动,在选择菜单项0时,它产生服务B,它在新线程中启动一个可运行的C. 我在活动A中有一个TextView,我想在线程C中访问它.
我已经尝试将TextView作为公共静态字段,但这会产生以下错误:
07-21 07:26:25.723: ERROR/AndroidRuntime(1975): android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
07-21 07:26:25.723: ERROR/AndroidRuntime(1975): at android.view.ViewRoot.checkThread(ViewRoot.java:2440)
07-21 07:26:25.723: ERROR/AndroidRuntime(1975): at android.view.ViewRoot.invalidateChild(ViewRoot.java:522)
07-21 07:26:25.723: ERROR/AndroidRuntime(1975): at android.view.ViewRoot.invalidateChildInParent(ViewRoot.java:540)
07-21 07:26:25.723: ERROR/AndroidRuntime(1975): at android.view.ViewGroup.invalidateChild(ViewGroup.java:2332)
07-21 07:26:25.723: ERROR/AndroidRuntime(1975): at android.view.View.invalidate(View.java:4437)
07-21 07:26:25.723: ERROR/AndroidRuntime(1975): at android.widget.TextView.updateAfterEdit(TextView.java:4593)
07-21 07:26:25.723: ERROR/AndroidRuntime(1975): at android.widget.TextView.handleTextChanged(TextView.java:5932)
07-21 07:26:25.723: ERROR/AndroidRuntime(1975): at android.widget.TextView$ChangeWatcher.onTextChanged(TextView.java:6081)
07-21 07:26:25.723: ERROR/AndroidRuntime(1975): at android.text.SpannableStringBuilder.sendTextChange(SpannableStringBuilder.java:889)
07-21 07:26:25.723: ERROR/AndroidRuntime(1975): at android.text.SpannableStringBuilder.change(SpannableStringBuilder.java:352)
07-21 07:26:25.723: ERROR/AndroidRuntime(1975): at android.text.SpannableStringBuilder.change(SpannableStringBuilder.java:269)
07-21 07:26:25.723: ERROR/AndroidRuntime(1975): at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:432) …Run Code Online (Sandbox Code Playgroud) 我知道C++/CLI代码
void foo(Bar^% x);
Run Code Online (Sandbox Code Playgroud)
变成了
Void foo(ref Bar x);
Run Code Online (Sandbox Code Playgroud)
什么是C++/CLI代码
Void foo(out Bar x);
Run Code Online (Sandbox Code Playgroud)
?
声明如下的内容
void foo(int x) { std::cout << "foo(int)" << std::endl; }
void foo(const int &x) { std::cout << "foo(const int &)" << std::endl; }
Run Code Online (Sandbox Code Playgroud)
有意义吗?调用者如何能够区分它们?我试过了
foo(9); // Compiler complains ambiguous call.
int x = 9;
foo(x); // Also ambiguous.
const int &y = x;
foo(y); // Also ambiguous.
Run Code Online (Sandbox Code Playgroud) 我知道STL容器会复制对象.所以说我有一个
list<SampleClass> l;
Run Code Online (Sandbox Code Playgroud)
每当我这样做
SampleClass t(...);
l.push_back(t);
Run Code Online (Sandbox Code Playgroud)
将制作一份副本.如果SampleClass很大,那么它将非常昂贵.
但是,如果我将l声明为引用的容器,
list<SampleClass&> l;
Run Code Online (Sandbox Code Playgroud)
当我做
l.push_back(t);
Run Code Online (Sandbox Code Playgroud)
它会避免复制对象吗?