C 什麼情況下會產生臨時變數

2021-09-20 03:55:25 字數 1460 閱讀 3335

臨時變數是只在呼叫期間有效,具有常性的一種變數。

在返回值以值傳遞(傳值和傳指標)的形式返回時,會生成臨時變數。

int sum(int a,int b)

編譯器會將結果a+b的值拷貝給臨時變數,最終返回的是臨時變數;

在函式呼叫中,如果形參是引用的型別的情況下:當實參和形參的型別不匹配會產生臨時變數;

string foo();

void bar(string &s);

bar(foo());//非法,型別不匹配,生成臨時變數,臨時變數是const型別,而形參是非const型別

bar("hello");//非法

如果形參是常引用型別:

當型別匹配,但不是左值,會產生臨時變數;

當型別不匹配,但是可以轉換為正確的型別時,會產生臨時變數;

double refcube(const double& ra)  

double side = 3.0;

double* pd = &side;

double& rd = side;

long edge = 5l;

double lens[4]=;

double c1 = refcube(side); // ra 是side

double c2 = refcube(lens[2]); // ra是lens[2]

double c3 = refcube(rd); // ra 是 rd

double c4 = refcube(*pd); // ra 是*pd

double c5 = refcube(edge); // ra 是臨時變數

double c6 = refcube(7.0); // ra 是臨時變數

double c7 = refcube(side+10.0); // ra 是臨時變數

long型別和double型別不匹配,產生臨時變數;7.0、side + 10.0與double型別相對應,但由於不是左值,也產生臨時變數;這些臨時變數只是在函式呼叫期間存在;

到這裡可能會有乙個疑問,既然被調函式的引數列表型別中加const和不加const都會產生臨時變數,那為什麼還要加const?

1、在有必要時產生臨時變數,保證原始資料不被修改。

2、保證**合法;如果沒有const型別修飾,在型別不匹配時,在呼叫點會產生臨時變數,就會嘗試使const型別轉換為非const型別,當然,這樣是非法的;有const型別修飾的情況下產生臨時變數,操作的也是臨時變數;根本來講,這一點也是為了保證原始資料不被修改。

強轉型別轉化,一定有臨時變數。

double a = 10.5;

cout << (int)a ;

cout << a;

輸出:10和10.5

所以在強轉時,一定生成臨時變數,原始資料本身並沒有改變。

什麼情況下會初始化類

都什麼情況下會初始化類 public class a static public void run public void service public class b extends a public static void main string args 答案 static block a s...

mysql什麼情況下會觸發表鎖

在上面講到的併發事務處理帶來的問題中,更新丟失 通常是應該完全避免的。但防止更新丟失,並不能單靠資料庫事務控制器來解決,需要應用程式對要更新的資料加必要的鎖來解決,因此,防止更新丟失應該是應用的責任。髒讀 不可重複讀 和 幻讀 其實都是資料庫讀一致性問題,必須由資料庫提供一定的事務隔離機制來解決。資...

Kafka在什麼情況下會丟資料

kafka是高吞吐量資料匯流排,使用得當會使我們處理業務如魚得水,如虎添翼。處理不當也會使系統殘破不堪,維護起來痛苦萬分,我們針對資料可靠性這點,來分析下這個訊息元件在什麼情況下會丟失資料。一 producer配置acks 0 在acks 0模式下,訊息傳輸到broker端沒收到broker的反饋即...