繁体   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