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