出于好奇,我开始想知道是否有可能有三元表达式,如果它的计算结果为假,则在假分支中不执行任何操作。
也就是有办法写这样的东西:
variable = (someBool) ? i : <do nothing>;
相反:
if (someBool) {
variable = i;
}
我尝试使用((void)0)
或while(false){};
作为no-op,但编译器需要一个表达式。
更新:
我意识到问题失去了一些意义,因为我试图让代码更容易。我最初的想法是使用三元数初始化静态变量 - 使用静态变量本身作为条件:
static int var = (var != 0) ? var = 1 : (var already initialized, do nothing);
这假设未初始化的变量初始化为0,这并不总是正确的(或者永远不会在发布版本中,不太确定)。所以也许这是一个假设的问题。
short-circuit怎么样?
int variable = 0;
bool cond = true; // or false
(cond && (variable = 42));
printf("%d\n", variable);
有一个非常简单的解决方法:null lambda。
auto null_lambda = [](){return;};
int a = 1;
int b = 2;
vector<int> c;
a > c ? b = c.push_back(b) : null_lambda();
只需在代码顶部定义所需类型的各种null lambda即可。
在F#(和Haskell,我相信)中,你一直使用“()”单元执行此操作。这个符号或多或少是一个null lambda返回void。所以,这将是c ++中的基本函数式编程。
这个怎么样:
variable = (someBool) ? i : variable ;
虽然我个人更喜欢原来的if语句
编译器不仅期望表达式,而且表达式左侧返回type
(无论是variable
的类型)。所以,不,你不能这样做。这不是条件执行,而是variable
成员任务。
这些是完全不同的东西。在第二个例子中:
if (someBool) {
variable = i;
}
你不分配任何东西,而只是根据条件执行。所以在你的情况下,你不想做任何事情(不分配任何东西),要走的路是条件执行,所以简单地使用第二种情况。
解决你的编辑问题:在静态范围的C99变量中初始化为0.但是,我从未真正相信这一点,因为自从K&R时代以来我一直在用C编程。
无论如何,只需初始化变量。由于变量是静态的,它只会在程序的整个执行时间内发生一次。
你可以这样做:
variable = !someBool ?: i;
因为当if表达式为真时,?:将禁止运算,但如果为假,则指定i。
注意:这只在Obj-C中测试过
怎么样
(someBool) ? (variable = i) : NULL;
对于C#说:语法:
condition ? first_expression : second_expression;
它说的是first_expression和second_expression:
first_expression和second_expression的类型必须相同,或者从一种类型到另一种类型必须存在隐式转换。
如果你要评估一个可以为空的对象类型而不是bool
,你总是可以写:
variable = myVar ?? i;
Hacky / cludgey / impractical - 可能全部都是3,但是为了这个问题,这是一种省略'else'的方法。