【问题标题】:How to write one line and nested 'if' statement without '?:' (is it possible?)如何在没有'?:'的情况下编写一行和嵌套的'if'语句(可能吗?)
【发布时间】:2015-07-10 15:59:57
【问题描述】:

是否可以编写一行if-else 语句(即仅使用一个;)不使用 使用?: 表达式?例如某种形式的东西: if (p == 1) " " else "\n";

潜在目的可能是: cout << if (p == 1) " " else "\n";

只是好奇这是否可能,不知道是否有任何实际应用。

谢谢

【问题讨论】:

  • 将尽可能多的代码打包到一行中对于“真正的”编码来说并不是一个好主意。也许作为学术练习很有趣,但在工作中,代码必须可读而不是紧凑。
  • 感谢您的回复,因为您提到这只是一个学术练习。
  • 既然三元已经存在,为什么语言会有与三元相同的特性?
  • 一个学术练习可能会让你的问题被禁止...
  • 反对这个问题的所有反对票是怎么回事?是否有用于否决合法问题的特殊徽章?

标签: c++ c++11 g++4.9


【解决方案1】:

基本上:不,不可能这样做:

cout << if (p == 1) " " else "\n";

这正是?: 运算符的目的——它产生了价值。 if-else 语法可能无法实现某些事情。示例:条件初始化。考虑:

if(p == 1)
    int value = 1; //local variable!
else
    int value = 0; //and so is this one!

//here 'value' is unknown

以上问题可以这样解决:

int value; //default initialization

if(p == 1)
    value = 1; //assignment to already initialized variable!
else
    value = 0; //and so is this!

但这两者并不相等。对于某些类型,它可能会导致完全不同的行为,因为初始化与赋值不同。 ?: 是一个解决方案:

int value == (p == 1) ? 1 : 0; //'value' is initialized with value, that depends on 'p'

不要试图在没有工具的情况下做事,这些工具旨在为你做这件事。

【讨论】:

  • if-else 不能替代三元条件运算符的一个示例是在初始化引用时。
  • 感谢您的回复,这表明我的困惑激发了最初的问题。
【解决方案2】:

这不能解决一般问题,但它确实适用于您提供的具体示例。

std::cout << " \n"[(bool)(p - 1)];

解释:

首先,字符串文字(例如" \n")是一个数组。因此,它参与了指针衰减,并且可以像任何其他指针或数组一样被索引。

其次,整数可以转换为布尔值,并且转换具有特殊属性,即零转换为false,其他任何内容都转换为true。所以当我从p 中减去1,然后将其转换为bool 时,如果p 为1,则为false,否则为true。

第三,布尔值可以(隐式)转换回整数。 false 转换为 0,true 转换为 1。因此从 int 转换为 bool 并返回的结果是 0 保持为 0,而其他任何东西都变为 1。

因此,考虑到这三点,表达式:

" \n"[(bool)(p - 1)]

导致以下两种可能性之一:

" \n"[0]      // a space (if p == 1)
" \n"[1]      // or a newline (if p != 1)

如果可以的话,我会否决这个答案。

【讨论】:

  • 哇.....这是一个黑客......请扩展它的工作原理,以便人们理解为什么它是这样一个黑客。
  • 它比 hack imo 更愚蠢:P 我喜欢它的创造性。
  • 或者等效地,对于更响亮的 WTF,std::cout &lt;&lt; ((bool)(p - 1))[" \n"];:P
  • 免责声明:请不要在生产代码...或任何代码附近执行此操作
  • 我可能只是为了好玩才使用!!(p - 1) ;)
【解决方案3】:

您已经使用了两个重要的词,它们是理解为什么您的意图不可能实现的关键,但您可能还没有掌握它们的全部含义:Statement 和 expression。

if statement(如 all 语句)不产生值,而 ?: operator 是一个产生值的表达式。

区分语句和表达式是一个值得学习的基本概念(查看此答案中的链接,慢慢来!),不仅适用于 C++,而且适用于几乎所有编程语言。

【讨论】:

  • 感谢您的解释,是的,我认为这是我问题的根源。
  • @calculamator 可悲的是,我试图提供帮助并具有建设性,指出您理解中的根本问题,并帮助您学习和提高自己。结果:零赞成票。 (不是你的错)。同时,某个其他答案(到目前为止)获得了 13 个赞成票,而恕我直言,这只是一个破坏性和不耐烦的咆哮。这些是我无法理解 SO 社区的时刻。没关系,继续... :)
  • 哦,还有一件事:我不知道你的背景,但在其他编程语言中,if 是一个表达式,而不是一个语句。我什至知道至少一种同时具有if-statement 和 if-expression 的语言。这就是为什么学习概念和范式很重要的原因,这样您就可以更快更好地学习新语言,并获得更深入的理解,远远超出语法本身。
  • 您的回答非常有帮助,因为我最初的误解是 ?: 只是编写 if-else 语句的另一种方式(现在知道不是这样)。对于其他具有if-else 语句作为表达式的语言也非常有趣,在学习新语言时会牢记这种分离。也不太关心否决票,因为大多数答案的质量都很高,我的问题和疑虑都得到了解答。
【解决方案4】:
cout << [=]{ if (p == 1) return " "; else return "\n"; }();

【讨论】:

  • "即只使用一个;"他的意思不是词汇线。
  • @LightningRacisinObrit 它符合“潜在目的”。此外,我不会让这段代码看起来像它不是的任何东西。 OP 可以决定这是否符合他们的要求。
  • 我应该澄清一下,这是一个 学术 练习,并且对表示 if-else 声明的其他方式感到好奇。感谢您的回复,我以前从未见过这种方式。 (不幸的是,因为没有 15 声望,所以无法投票……)
  • 哪个语句更短更简洁?三元运算符,还是使用 lambda 代替?
【解决方案5】:

你问的是“我如何做 X,而不使用语言提供的任何工具来做 X”。真傻。

答案是否定的。这是不可能的。

【讨论】:

  • @LucasTrzesniewski:我看不出你在 0[argv]?? 周围的三合字母/二合字母技巧的相关性??
  • 是的,这并不像我想象的那么明显......我的意思是:如何写[而不实际写[ ;-)
  • @LucasTrzesniewski:这两件事都是“语言提供的用于执行 X 的工具”:P
猜你喜欢
  • 2019-03-06
  • 1970-01-01
  • 2017-02-27
  • 2021-06-25
  • 2014-11-25
  • 1970-01-01
  • 1970-01-01
  • 2021-09-29
  • 1970-01-01
相关资源
最近更新 更多