如何在没有'?:'的情况下编写一行和嵌套的 'if' 语句(这可能吗?)
How to write one line and nested 'if' statement without '?:' (is it possible?)
是否可以写一行 if-else
语句(即只使用一个 ;
)而不用 使用 ?:
表达式?例如某种形式:
if (p == 1) " " else "\n";
潜在用途可能是:
cout << if (p == 1) " " else "\n";
只是好奇这是否可行,不知道是否有任何实际应用。
谢谢
你问的是 "how do I do X, without using any of the tools the language provides to do X"。太傻了。
答案是否定的。不可能。
cout << [=]{ if (p == 1) return " "; else return "\n"; }();
基本上:不,不可能这样做:
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'
不要尝试在没有工具的情况下做事,这些工具是为您设计的。
这没有解决一般问题,但它确实适用于您提供的具体示例。
std::cout << " \n"[(bool)(p - 1)];
解释:
首先,字符串文字(例如" \n"
)是一个数组。因此,它参与了指针衰减,并且可以像任何其他指针或数组一样进行索引。
其次,整数可以转换为布尔值,转换有特殊的属性,零转换为false
,其他任何转换为true
.因此,当我从 p
中减去 1,然后将其转换为布尔值时,如果 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)
如果可以的话,我会否决这个答案。
您已经使用了两个重要的词来理解为什么您的意图是不可能的,但您可能还没有掌握它们的全部含义:Statement and expression.
if
statement (like all statements) does not yield a value, while the ?:
operator 是一个产生值的表达式。
区分语句和表达式是一个值得学习的基本概念(查看此答案中的链接并慢慢来!),不仅适用于 C++,而且适用于几乎所有编程语言。
是否可以写一行 if-else
语句(即只使用一个 ;
)而不用 使用 ?:
表达式?例如某种形式:
if (p == 1) " " else "\n";
潜在用途可能是:
cout << if (p == 1) " " else "\n";
只是好奇这是否可行,不知道是否有任何实际应用。
谢谢
你问的是 "how do I do X, without using any of the tools the language provides to do X"。太傻了。
答案是否定的。不可能。
cout << [=]{ if (p == 1) return " "; else return "\n"; }();
基本上:不,不可能这样做:
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'
不要尝试在没有工具的情况下做事,这些工具是为您设计的。
这没有解决一般问题,但它确实适用于您提供的具体示例。
std::cout << " \n"[(bool)(p - 1)];
解释:
首先,字符串文字(例如" \n"
)是一个数组。因此,它参与了指针衰减,并且可以像任何其他指针或数组一样进行索引。
其次,整数可以转换为布尔值,转换有特殊的属性,零转换为false
,其他任何转换为true
.因此,当我从 p
中减去 1,然后将其转换为布尔值时,如果 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)
如果可以的话,我会否决这个答案。
您已经使用了两个重要的词来理解为什么您的意图是不可能的,但您可能还没有掌握它们的全部含义:Statement and expression.
if
statement (like all statements) does not yield a value, while the ?:
operator 是一个产生值的表达式。
区分语句和表达式是一个值得学习的基本概念(查看此答案中的链接并慢慢来!),不仅适用于 C++,而且适用于几乎所有编程语言。