C++ C++;三值运算符逻辑

C++ C++;三值运算符逻辑,c++,ternary-operator,C++,Ternary Operator,我很难弄清楚这个if语句在做什么。这不是我的代码,所以我只是想了解三元运算符在做什么 if((model[STRIDE].isLogging == true ? model[STRIDE].value : g_uiStride) == g_uiStride && (model[NUMVERTS].isLogging == true ? model[NUMVERTS].value : NumVertices) == Num

我很难弄清楚这个if语句在做什么。这不是我的代码,所以我只是想了解三元运算符在做什么

    if((model[STRIDE].isLogging == true ? model[STRIDE].value           : g_uiStride)   == g_uiStride &&
       (model[NUMVERTS].isLogging == true ? model[NUMVERTS].value       : NumVertices)  == NumVertices &&
       (model[PRIMCOUNT].isLogging == true ? model[PRIMCOUNT].value     : primCount)    == primCount &&
       (model[STARTINDEX].isLogging == true ? model[STARTINDEX].value   : startIndex)   == startIndex)
    {

三元运算符如下所示:

(condition) ? value_for_true_condition : value_for_false_condition
(model[STRIDE].isLogging==true?model[STRIDE].value:g_uiStride)
首先检查
isLogging==true
,(条件)。如果条件为true,则使用
model[STRIDE].value
值,如果条件为true,则使用
g_uiStride

语句作为一个整体检查模型的所有成员上的值,但仅当成员
.isLogging==true
时才检查。否则,它将使用默认值。请注意,如果所有成员都将
.isLogging
变量设置为false,则此语句将始终为true。

首先

(model[STRIDE].isLogging == true ? model[STRIDE].value : g_uiStride) == g_uiStride
可以这样写:

(model[STRIDE].isLogging ? model[STRIDE].value : g_uiStride) == g_uiStride
三元

model[STRIDE].isLogging ? model[STRIDE].value : g_uiStride
检查模型[STRIDE].isLogging是否为真。如果是,则采用值
model[STRIDE].value
。如果不是,则取值
g_uiStride
。然后将其与g_uiStride进行比较

因此,如果它没有记录,那么这一部分将自动为真,因为
g_uiStride
将与它自身进行比较。如果它正在记录,则如果
mode[STRIDE].value==g_uiStride

if  (model[STRIDE].isLogging) {
   blah =  model[STRIDE].value ;
} else {
   blah =  g_uiStride;
}

通常,三元条件运算符使用一个条件在两个选项中进行选择:

condition ? first_alternative : second_alternative
在这种情况下,通过比较true和一个对象本身,它是非常不必要的复杂

if((model[STRIDE].isLogging == true ? model[STRIDE].value : g_uiStride) == g_uiStride 
这可以归结为

if((model[STRIDE].isLogging ? model[STRIDE].value : g_uiStride) == g_uiStride 
这也相当于

if (model[STRIDE].value == g_uiStride || !model[STRIDE].isLogging

<>告诉我们,<代码>值<代码>等于一些全局值,或者我们不关心,因为我们没有记录。无论如何,你知道三元操作符是如何工作的吗?你知道多少C++?你是从一本好书开始的吗?Pfff,这个公式我也有问题。看起来像
true的位?模型[STARTINDEX]。值:例如STARTINDEX
。这不也让你皱眉吗?当然我能弄明白,但它肯定会用更多的括号!但是,由于模型[STRIDE].value是整数,而模型[STRIDE].isLogging是布尔值,这是否意味着模型[STRIDE].value接收到1或0,您如何知道与self的比较结果为true?您是否曾重载运算符或使用过
double
s?user1143896:model[STRIDE]。结果中未指定值。三元语句的结果取代了整个语句。Kerrek SB:我的C++天是很久以前的事了,我不知道你的意思。你是说==可能过载了?它有相同的短路吗?此外,您可能会匆忙假设
g_uiStride==g_uiStride
始终是
true
,这我们不知道。我们什么都不知道,但假设没有调用
abort()
操作符[]
重载,我认为这已经足够接近了。:-)
if((model[STRIDE].isLogging ? model[STRIDE].value : g_uiStride) == g_uiStride 
if (model[STRIDE].value == g_uiStride || !model[STRIDE].isLogging