![](/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.