С ++ Тернарная операторная логика - PullRequest
2 голосов
/ 11 января 2012

Мне трудно понять, что делает этот оператор 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)
    {

Ответы [ 5 ]

5 голосов
/ 11 января 2012

Первый

(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

проверяет, является ли model[STRIDE].isLogging истинным. Если это так, он принимает значение model[STRIDE].value. Если нет, он принимает значение g_uiStride. Это тогда по сравнению с g_uiStride.

Итак, если это не логирование, то эта часть автоматически становится истинной, поскольку g_uiStride сравнивается с самим собой Если это логирование, это правда, если mode[STRIDE].value == g_uiStride и

3 голосов
/ 11 января 2012
#1. 
if (model[STRIDE].isLogging is true then 
    RESULT1 = (model[STRIDE].value == g_uiStride) else
    RESULT1 = (g_uiStride == g_uiStride)
   )   

#2. 
if (model[NUMVERTS].isLogging is true then 
    RESULT2 = (model[NUMVERTS].value == NumVertices) else
    RESULT2 = (mVertices == NumVertices)
   )        

#3. 
if (model[PRIMCOUNT].isLogging is true then
    RESULT3 = (model[PRIMCOUNT].value == primCount) else
    RESULT3 = (primCount == primCount)
   }   

#4. 
if (model[STARTINDEX].isLogging is true then
    RESULT4 = (model[STARTINDEX].value == startIndex) else
    RESULT4 = (startIndex == startIndex)
   )   

if (RESULT1 && RESULT2 && RESULT3 && RESULT4) {
    /* yay */
} else {
    /* damn */
}   
1 голос
/ 11 января 2012

Обычно троичный условный оператор использует условие для выбора между двумя альтернативами:

condition ? first_alternative : second_alternative

В этом случае очень неоправданно сложно сравнить с истинным и одним объектом с самим собой

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

говорит нам, что либо value равно некоторому глобальному значению, либо нам все равно, потому что мы все равно не регистрируем.

0 голосов
/ 11 января 2012
blah = (model[STRIDE].isLogging == true ? model[STRIDE].value           : g_uiStride)

совпадает с

if  (model[STRIDE].isLogging) {
   blah =  model[STRIDE].value ;
} else {
   blah =  g_uiStride;
}
0 голосов
/ 11 января 2012

Тернарный оператор выглядит следующим образом:

(condition) ? value_for_true_condition : value_for_false_condition

(model[STRIDE].isLogging == true ? model[STRIDE].value : g_uiStride) сначала проверяет, является ли isLogging == true (условие). Если условие истинно, используется значение model[STRIDE].value, если не верно, используется значение g_uiStride.

Оператор в целом проверяет значения для всех этих членов модели, но только если член .isLogging == true. В противном случае он использует значение по умолчанию. Обратите внимание, что этот оператор всегда будет истинным, если для всех членов переменной .isLogging установлено значение false.

...