![](/img/trans.png)
[英]Can someone explain what's happening here (classes and constructors/destructors)?
[英]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。
一點都不。 v
是std::vector<long>
(假設vector
是std::vector
), w
是const 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
常量的指針 - 不要與指向long
的const
指針混淆。 指針的值被初始化為三元表達式的結果: (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.