【问题标题】:Can someone explain what is happening on line 3?有人可以解释第 3 行发生了什么吗?
【发布时间】:2021-05-26 23:22:23
【问题描述】:
vector<long> v = {1,2,3};
long i = v.size();
const long* w = (i != 0) ? &v.front() : NULL;

谁能解释第 3 行发生了什么?对我来说,感觉就像 v = w。我理解的对吗?

【问题讨论】:

  • ternary operator 你觉得奇怪吗?
  • 您可以将其重构为if (i != 0) w = &amp;v.front(); else w = NULL;
  • 阅读 Jarod42 或 cplusplus.com/articles/1AUq5Di1 的参考资料,您就会明白它的含义
  • 只是为了迂腐:long i = v.size() 不如 size_t i = v.size() 更好,在 C++ 中,您应该使用 nullptr 而不是 NULL
  • 哦,我明白了。谢谢! @zois

标签: c++ conditional-operator


【解决方案1】:

e1 ? v1 : v2

这是?:表达式,当表达式(e1)为真时,它返回v1,否则返回v2

这里的意思是如果v里面没有值,则指向NULL的常量指针(一旦分配地址就不能改变地址)。如果v 内部至少有一个元素,则为第一个元素的地址。

【讨论】:

  • 它是一个指向 long 的指针,它是 const,这意味着您不能更改指向的值,但确实可以更改指针指向的位置。三元运算符不仅仅是 ?,而是?:
  • 非常感谢!
【解决方案2】:

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

w 是一个指向 long 常量的指针 - not to be confused with a const pointer to a long。指针的值正在初始化为三元表达式的结果:(i != 0) ? &amp;v.front() : NULL;


?: 运算符根据结果返回两个值之一 一个表达式。

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


如果(i != 0) 为真,则结果将是address ofv.front() 返回的引用(即:向量v 中的第一个元素)。如果表达式的计算结果为 false,则 w 将是一个空指针。

The "Clockwise/Spiral Rule" 是确保您正确理解任何声明的好规则 - 理解这条规则可以让您免去一些麻烦。

【讨论】:

    【解决方案3】:

    "const long* w = (i != 0) ? &v.front() : NULL; " 检查向量是否有元素。如果 vector 有元素,它会将第一个元素的地址分配给 long 类型指针。 ?是三元运算符。例如 int a=1;int b=2; (a

    【讨论】:

      【解决方案4】:

      感觉就像 v = w。

      不,一点也不。 vstd::vector&lt;long&gt;(假设 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

      【讨论】:

      • 现在我明白了。非常感谢您的解释!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-16
      • 2020-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多