如何写一行和没有'?:'的嵌套'if'语句(可能吗?)

时间:2015-04-30 19:40:37

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

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

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

如果可能的话,只是好奇,不知道是否有任何实际应用。

由于

3 个答案:

答案 0 :(得分:5)

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

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

说明:

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

其次,可以将整数转换为bool,并且转换具有将零转换为false的特殊属性,并将其他任何内容转换为true。因此,当我从p中减去1时,将其转换为bool,如果false为1则为p,否则为true

第三,bool可以(隐式)转换回整数。 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)

如果可以的话,我会回答这个问题。

答案 1 :(得分:3)

你已经使用了两个重要的词来解决为什么你想要的不可能,但你可能还没有掌握它们的全部含义:Statementexpression

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

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

答案 2 :(得分: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'

如果没有专门为你做这件事的工具,请不要尝试做事。