我很好奇c ++如何处理这个嵌套的条件运算符。我很确定我理解它是如何工作的,但我很好奇,任何人都可以通过图解释循环如何执行嵌套条件运算符。
例如,循环是否会为每个实例执行每个条件运算符的第一个表达式?
此嵌套条件运算符的结构也是:
(i< 2)? x [i]:y;
!我? y:x [1];
我想我对此的本质非常好奇。除非你能够给我一个关于循环如何执行这个条件运算符的充分解释,否则请不要回答。
#include "stdafx.h"
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
const char x[2] [20] = {" Cloud "," at your service\n"};
const char * y = "Strife";
for (int i = 0; i < 7; i++)
cout << (( i < 2)? !i ? x [i] : y : x[1]);
cout << endl << endl << x[0] << endl << x[1] << endl;
cin.get();
cin.get();
return 0;
}
答案 0 :(得分:6)
您似乎在询问如何解析像x ? y ? 1 : 2 : 3
这样的表达式。
如果你考虑一下,实际上只有一种可能性。也就是说,最右边的:
必须绑定到左边最远的?
。因此表达式解析为:
x ? (y ? 1 : 2) : 3
因此,如果x
和y
为true
,则会返回1
;如果x
但y
不是true
,则返回2
;如果x
为false
,则会返回3
。
很抱歉不能直接回答您的问题,但我觉得按照这种方式会更容易。
答案 1 :(得分:4)
如果有疑问,拼出来......
for (int i = 0; i < 7; i++)
{
if (i < 2) {
if (!i) { // technically, this is "if i == 1"
cout << x[i];
} else { // and this is "if i == 0"
cout <<y;
}
} else {
cout << x[1];
}
}
简单地说明一下。 ?
之前的所有内容都放在if
中,然后只需打开{
,直到我们看到:
。
答案 2 :(得分:1)
操作员在编写时没有结构化。也许用圆括号更清楚:
cout << ((i < 2) ? (!i ? x [i] : y) : x[1]);
答案 3 :(得分:1)
已经对条件意味着什么进行了一些很好的分析。只是想提出一些建议:
?
和:
交替,其中任何一个或两个都应该更容易跟踪他们的行为。
考虑:
i < 2 ? !i ? x[i] : y : x[1] # somewhat confusing...
只是缩进以显示处理优先级:
i < 2 // if just put ? and : beneath related condition
? !i // then if
? x[i] // then
: y // else
: x[1] // else
或者为了简化同时保持单行简洁,请尝试:
i >= 2 ? x[1] : !i ? x[i] : y # equivalent but simpler to "grok" (see below)
指定为候补?
和:
的表达式就像一个简单的if
/ else if
/ else if
/ else
链一样,所以你可以在您完成工作的过程中稳步处理并消除可能性。
if (i >= 2)
(value is) x[1]
else if (!i)
x[i]
else
y;
我有时也会在线间写交替条件:
std::cout << (i >= 2 ? x[1] : // "if condition1 then value1 else
!i ? x[i] : // if condition2 then value2 else
y); // value3"
...或者有时(取决于线条长度和视觉复杂性)进入整个猪群并排列:
?
下面的std::cout << (i >= 2
? x[1]
: !i
? x[i]
: y);
...
{{1}}
与C ++源代码的许多风格方面一样,选择一个漂亮的布局是一种艺术 - 但实验是一种很好的方式来感受它。