2014
Mar
24

不管是工作上或是在家里写程式,我都需要同时开发 Javascript, PHP, C&C++ 这几种程式,虽然都是写了好几年的程式,但还是常常会搞混,今天就将这几个语言的 「Call by reference 」用法记录下来。

C&C++ Call by Reference

C 语言的 call by reference 是有很标准的定义,int a 代表一般的变数,而 int &a 代表变数会以 call by reference 的方式传递,这时 a 与传入值(b)会同步,看下面的范例,在 function test1 中,不管 a 值如何变化,传入的值都不会受影响,而在 function test2 中,则是使用 call by reference 的方式,所以当 a 被改变了, 传入的值 b 也跟著变化 。

Example
  1. #include "stdio.h"
  2. #include "stdlib.h"
  3. void test1(int a) {
  4. a = 10;
  5. }
  6. void test2(int &a) {
  7. a = 10;
  8. }
  9. main() {
  10. int a = 1;
  11. int b = 1;
  12. int c[2] = {1, 0};
  13. test1(a);
  14. printf("%i n", a);
  15. //output: 1
  16. test2(b);
  17. printf("%i n", b);
  18. //output: 10
  19. }

C&C++ 中的 Array 一定会是一个指标物件,所以强迫变成 call by reference 的方式。

Example
  1. #include "stdio.h"
  2. #include "stdlib.h"
  3. void test3(int array[]) {
  4. array[1] = 2;
  5. }
  6. main() {
  7. int c[2] = {1, 0};
  8. test3(c);
  9. printf("%i %i", c[0], c[1]);
  10. // output: 1 2
  11. }

PHP Call by Reference

PHP 要将变数以 Reference 得方式传给 function 时,必须在 function 定义变数名称时,前面加上 「&」 符号 ,下面的两个 function,第一个 test1 不带 「&」 符号,所以没有 Reference 的效果,就算你的变数是 Array 也是一样无效,而第二个 test2 则有 Reference 的效果,当变数值被改变,原传入前的变数也跟著同步。

Example
  1. <?php
  2. $a = array("ss");
  3. $b = array("ss");
  4. function test1($array) {
  5. $array[] = "bbb";
  6. }
  7. function test2(&$array) {
  8. $array[] = "bbb";
  9. }
  10. test1($a);
  11. print_r($a);
  12. // Output: Array (ss)
  13. test2($b);
  14. print_r($b);
  15. //Output: Array(ss, bbb)

Javascript call by reference

Javascript 中,只要是 Array, Object 都会以 call by reference 的方式传递,而一般的 String, Number 等变数值则以 call by value 的方式传递,看下面的范例, test1 的参数 i 是一值的数字,所以没有 call by reference 的效果,而 test2 的参数 array ,他的变数形态就是一个 Array,所以只要 array 被修改,传入的参数值也会跟著变动。

Example
  1. function test1(i) {
  2. i = 2;
  3. }
  4. function test2(array) {
  5. array[1] = 2;
  6. }
  7. var a = 1;
  8. var b = [1];
  9. test1(a);
  10. console.log(a);
  11. //output: 1
  12. test2(b);
  13. console.log(b);
  14. //output: 1, 2

回應 (Leave a comment)