引子
上篇文章《C語言函式傳參の結構體陣列篇》提到了C語言的函式引數傳遞方式,百度了一一一大圈,有說兩種的,也有說三種的,簡直把我搞暈了,“值傳遞和地址傳遞”是毫無疑問的兩點,其中有爭議的地方就是參考傳遞方式,
我看好多寫支持“參考傳遞”方式的都把源代碼代碼貼出來了,還有列印資訊,真的不能再真啊!難道列印會騙人?一定是哪里出了鬼了!我要打破沙鍋問到底!看看誰是李逵,誰是李鬼!
排查
經過多次測驗驗證,最后我發現和編譯環境(gcc與g++編譯器)有關,下面是對比驗證程序:
gcc 9.1.0
#include<stdio.h>
void myswap(int &x, int &y) //傳參考
{
int t;
t=x;
x=y;
y=t;
}
int main()
{
int a = 0, b = 0;
myswap(a,b); //直接以變數a和b作為實參交換
printf("呼叫交換函式后的結果是:%d 和 %d\n", a, b);
return 0;
}
報錯:
jdoodle.c:2:17: error: expected ‘;’, ‘,’ or ‘)’ before ‘&’ token
2 | void myswap(int &x, int &y) //傳參考
| ^
jdoodle.c: In function ‘main’:
jdoodle.c:13:5: warning: implicit declaration of function ‘myswap’ [-Wimplicit-function-declaration]
13 | myswap(a,b); //直接以變數a和b作為實參交換
| ^~~~~~
g++14
#include<stdio.h>
void myswap(int &x, int &y) //傳參考
{
int t;
t=x;
x=y;
y=t;
}
int main()
{
int a = 0, b = 1;
myswap(a,b); //直接以變數a和b作為實參交換
printf("呼叫交換函式后的結果是:%d 和 %d\n", a, b);
return 0;
}
通過
呼叫交換函式后的結果是:1 和 0
總結
原來他們演示C語言支持參考傳遞時使用了g++編譯器,所以才編譯通過,隨之也就產生了錯誤的結論,
最后我們再重申一下吧,“參考傳遞做函式引數”是C++的特性,C語言不支持!,
以后大家應該這樣說:
“C語言函式引數傳遞有兩種方式:傳值,傳指標;C++函式引數傳遞有三種方式:傳值,傳指標,傳參考”
補充
還有一個就是函式多載也是C++才支持的(函式多載一種靜態多型),C語言也是不支持的,針對C、C++混合編程時需要注意,
引經據典
關于gcc與g++可以看看這篇文章《GCC與gcc,g++區別》
GCC:GNU Compiler Collection(GUN 編譯器集合),它可以編譯C、C++、JAV、Fortran、Pascal、Object-C、Ada等語言,
gcc是GCC中的GUN C Compiler(C 編譯器)
g++是GCC中的GUN C++ Compiler(C++編譯器)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/297344.html
標籤:其他
