【发布时间】:2013-10-15 05:53:06
【问题描述】:
出于好奇,我开始想知道是否有可能有一个三元表达式,如果它的计算结果为 false,则在 false 分支中什么也不做。
即有没有办法这样写:
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,这并不总是正确的(或者在发布版本中永远不会,不太确定)。所以也许这是一个假设性问题。
【问题讨论】:
-
如果变量是静态的,那么这个问题没有任何意义。因为在任何版本的 C 标准中,具有静态存储持续时间的变量的初始化表达式必须始终是常量表达式。此外,在任何版本的 C 标准中,静态存储持续时间变量总是初始化为 0。
-
赋值和初始化在 C 中实际上是两个不同的东西,静态变量的初始化器只在所有代码执行之前进行评估。
-
(C++也是如此)
-
实际上,不,他们不是。在 C++ 中,静态存储持续时间的变量的初始化表达式可以是任何东西,只要它本身已被初始化。例如。
rand()可以,虽然可能没有种子。
标签: c++ objective-c c ternary-operator