簡體   English   中英

有人可以解釋第 3 行發生了什么嗎?

[英]Can someone explain what is happening on line 3?

vector<long> v = {1,2,3};
long i = v.size();
const long* w = (i != 0) ? &v.front() : NULL;

有人可以解釋第 3 行發生了什么嗎? 對我來說,感覺就像 v = w。 我理解對了嗎?

e1? v1: v2

那是?:表達式,當表達式 ( e1 ) 為真時,它返回v1 ,否則返回v2

這里它表示指向NULL的常量指針(一旦分配地址就不能更改地址)如果v內部沒有值。 或者如果v內部至少有一個元素,則為第一個元素的地址。

感覺就像 v = w。

一點都不。 vstd::vector<long> (假設vectorstd::vector ), wconst long* 那是兩種完全不相關的類型。 您不能將一個分配給另一個。

實際上您的代碼類似於:

vector<long> v = {1,2,3};
const long* w = &v[0];

w是指向向量中第一個元素的指針。 v.front只是獲取對第一個元素的引用的另一種方式。 而且因為通常我們不知道v是否在索引0處有一個元素,所以作者添加了一個檢查:

vector<long> v = {1,2,3};
long i = v.size();
const long* w;
if ( v.size() != 0) w = &v.front();
else                w = nullptr;

一個不太冗長的寫法是使用條件運算符:

const long* w = ( v.size() != 0 ) ? &v.front() : nullptr;

根據條件,僅評估:的一側,因此可以避免對空向量中的元素0的越界訪問。

“const long* w = (i?= 0). &v:front(); NULL.” 檢查向量是否有元素,如果向量有元素。 它將第一個元素地址分配給長類型指針? . 是三元運算符; 例如 int a=1;int b=2? (a<b): "如果是真的做某事"; “如果假做某事”;

const long* w = (i?= 0). &v:front(); NULL;

w是指向long常量的指針 - 不要與指向longconst指針混淆 指針的值被初始化為三元表達式的結果: (i?= 0). &v:front(); NULL; (i?= 0). &v:front(); NULL;


?: 運算符根據表達式的結果返回兩個值之一。

來源: http://www.cplusplus.com/articles/1AUq5Di1/


如果(i != 0)為真,那么結果將是v.front()返回的引用地址(即:向量v中的第一個元素)。 如果表達式計算結果為 false,則w將是 null 指針。

確保您正確理解任何聲明的一個很好的規則是“順時針/螺旋規則” - 理解這條規則可以為您省去一些麻煩。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM