【问题标题】:How can I write the "?:" statements without using the '?' (question mark)?如何在不使用“?”的情况下编写“?:”语句(问号)?
【发布时间】:2021-03-04 15:07:39
【问题描述】:

node1 和 node2 是链表的节点。

Node* node1, Node* node2;
int carry = 0;
int sum;
sum = carry + (node1 ? node1->data : 0) + (node2 ? node2->data : 0);

因为x ? y : z 的作用类似于if(x) y else z 我试过了

if (node1 && node2)
 sum = carry + node1->data + node2->data;
else if(node1 && !node2)
 sum = carry + node1->data;
else if(!node1 && node2)
 sum = carry + node2->data;
else if(!node1 && !node2)
 sum = carry;

我们可以像这样使用布尔值一样使用节点吗?如果没有,不使用问号怎么写这个语句?

【问题讨论】:

  • auto data = [](Node* p, int default_value) { if (p) return p->data; return default_value; }; 然后使用int sum = carry + data(node1, 0) + data(node2, 0);

标签: c++ if-statement conditional-operator


【解决方案1】:

? : 被称为conditional operator(或者有时在类 C 语言的上下文中是三元运算符)。在 C++ 中,x ? y : z 的工作方式与 if (x) y else z 完全一样,只是 if else 块不是表达式并且不返回值。所以如果你可以使用node ?那么你可以使用if (node),任何数字表达式都可以转换为布尔表达式

但是,您实际上并没有组合 2 个三元表达式,并且需要这么多这样的 if 块。就像如何评估三元表达式一样

sum = carry
if (node1)
    sum += node1->data;
if (node2)
    sum += node2->data;

【讨论】:

  • 其实是条件运算符。三元运算符是接受 3 个操作数的任何运算符,巧合的是,C++ 只有一个这种类型,但原则上可能还有其他类型
  • 它也不像 if 那样“完全”,因为它计算为第二个和第三个运算符的常见类型,但在这种情况下,这是一个可能没问题的简化
  • @idclev463035818 对于更多的迂腐,它被许多人“称为”三元运算符当然是真的。
  • @aschepler 哈哈,我也有同样的想法,但我自己的挑剔似乎太可悲了;)。我会添加“口语化”,然后我就可以了
  • if…else? : 不同的示例:给定struct Blargh { Blargh(int x) { std::cout << "Blargh!\n"; } };0 ? Blargh(0) : 0; 打印“Blargh!”但if (0) Blargh(0); else 0; 没有。
猜你喜欢
  • 2021-09-29
  • 2019-03-06
  • 1970-01-01
  • 1970-01-01
  • 2017-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多