-7

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

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

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

谢谢

4

5 回答 5

14

您在问“我如何做 X,而不使用该语言提供的任何工具来做 X”。这很愚蠢。

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

于 2015-04-30T19:43:34.333 回答
5

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

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

解释:

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

其次,整数可以转换为布尔值,并且转换具有将零转换为 的特殊属性false,而其他任何内容都转换为true。因此,当我从 中减去 1 p,然后将其转换为 bool 时,false如果p为 1,则为 1,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)

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

于 2015-04-30T19:52:06.630 回答
3

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

if语句(与所有语句一样)不会产生值,而?:运算符是会产生值的表达式。

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

于 2015-04-30T20:13:45.933 回答
2
cout << [=]{ if (p == 1) return " "; else return "\n"; }();
于 2015-04-30T19:43:40.890 回答
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'

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

于 2015-04-30T19:50:28.823 回答