English 中文(简体)
在C++中,为什么真实的和真实的“真实的”、“假的”=真的?
原标题:In C++, why does true && true || false && false == true?

我很想知道,有人是否知道汇编者如何解释以下法典:

#include <iostream>
using namespace std;

int main() {
 cout << (true && true || false && false) << endl; // true
}

之所以如此,是因为和安处;其优先程度高于<>>> > / 因为> > 短路运营商(换言之,短路运营商是否无视随后的所有表述,或只是下一个表述)?

最佳回答

确切地说,答案是正确的,但我想回答你对回答的评论之一:

如果出现短路,便会执行第二个和安放项目;以及“安放”表达方式,即执行“|”的操作者被执行“贝恩加”第二和安普; 这意味着对“安放”和“安放”进行左对右执行;以及“安放”和“安放”;“安放”一词。

我认为,你所再次提出的问题的一部分是,这种优先权并不意味着你认为它意味着什么。 确实,<代码>&&的优等值高于>> >,确切地说,是你发现的行为。 审议普通算术操作员的案件:我们有<代码>a * b+ c*(d + e)。 我们知道的是,如何插入括号:首先在*上,然后在+上。 这使我们想到(a * b)+(c* (d + e));就你而言,我们有<代码>(1 && 1) <>(infiniteLoop) && infiniteLoop()。 然后,设想这些词语成为trees。 为此,将每个经营者变成一个 no子,其两个论点是儿童:

https://i.stack.imgur.com/M5Rqj.png” alt=“Expressionberry>

对这一树进行评价是出现短路的地方。 在算术树中,你可以想象出一种宽度第一的自下而上的执行风格:首先评价DE = d + e,然后评价AB = a * bCDE = c * DE,最后结果为 +ABE。 但请注意,您可以平等<> > >,并首先评价了<代码>AB,然后评价了DE,CDE,最后结果;你可以说明差异。 然而,自>>>和&amp:为短电路, have 用于这一左半头一次评价。 因此,为了对<条码>>>>进行评价,我们首先评价了<条码>1 && 1。 由于情况确实如此,> > 短路段并忽视了其右侧——尽管它已经评价了<>m>if,但它必须首先评价<代码>infiniteLoop() && infiniteLoop()。

如果能够帮助,你可以把树中的每一个 no视为功能呼吁,从而在第二种情况下产生以下表述:<代码>plus(时间(a,b),时间(c,plus(d,e));or(and(1,1),和(infiniteLoop(),infiniteLoop()。 短路是指,您必须充分评估每一左手功能论点至orand;如果是true(or>>(and),则忽视右手论点。

你的评论预先假定,我们首先以最优先的地位评价所有事项,然后以最高级的级别评估所有事项,等等,这相当于对树木进行最宽松的自下而上的处决。 相反,所发生的事情是,这种优势告诉我们如何建设树木。 在简单的算术案例中,树木执行规则是没有意义的;然而,短路恰恰是如何评价树木的具体特征。


<><>><>>>> 你在另一项评论中说,

你的算术例子要求在最后添加之前评估两种重复性,即不是什么界定了优先权?

是的,这是对优先权的界定,但并不真实。 在C中,这肯定是真实的,但审议您将如何评价(非C!)表述,0 * 5 ^ 7,其中5 ^ 7 = 57>>>>>>>>><>/code>的优于*>。 根据您的广度第一自下而上的规则,我们必须在找到结果之前,对<代码>05 ^ 7进行评价。 但是,您将 tt bother来评价5 ^ 7 <>code>;你仅说“现值,自0 x = 0 for all x, 即:0, 并绕过整个右侧。 换言之,在评估最终的多彩之前,我先对双方进行了全面评价;我走了短路。 同样,由于<代码>false &&_=虚假true > <><>>>>> = = 任何<代码_,我们不一定需要触及右侧;这意味着经营者要进行短路。 C don t short-range multiplication(尽管一种语言可以这样做),但does 短路&&>>>。

同短路<代码>0* 5 ^ 7” 一样,t t改变通常的PEMDAS优先规则,短路改动逻辑操作员的字眼改变如下事实:& 办公室;和; 高于。 它只是一个捷径。 由于我们必须选择经营者的some一面进行评价,C承诺首先评估逻辑操作员的左侧;一旦这样做,就会出现明显的(和有用的)方法,以避免对某些价值进行正确评估,C则承诺这样做。

你们的规则——评价第一种自下而上的表述——也是明确界定的,一种语言可以选择这样做。 然而,它处于不允许短路的不利地位,这是一种有用的行为。 但是,如果你树中的每一种表述都定义明确(不作任何选择)和纯(不修改变数、印刷等),那么你就能够说明差异。 只有在“以及”和“或”的数学定义不包含这些奇怪的情况下,才发现短路。

而且,注意到,对于通过确定最左的表述的优先次序而进行短路工程的事实,没有任何深层。 一种可以界定一种语文术语,其中⅋⅋<>>>>>> 和>>>>> ;<> ;<>0 ⅋⅋ infiniteLoop(; > ;infiniteLoop(>;infinite Loop(> ⅋⅋ 0 >;>>>> > > > )> < 1 这只是为了首先评估右侧而不是左侧,然后以同样的方式简化。

www.un.org/Depts/DGACM/index_spanish.htm 树苗:告诉我们,如何建造树苗。 评价 par树的唯一明智命令是,如果是,那么我们就评价其宽度-第一自下而上(如你想要做的那样),明确了纯净值<>。 对于未定义的或不确定的数值,必须选择~em>直线顺序。 一旦选择了一条线性命令,操作者一方的某些数值可以独一无二地确定整个表述的结果(e.g.,0 = 0 = 0,false && _=_&&; 因此,你可以不必按行程顺序对此后发生的一切情况进行评价,而C则答应向符合逻辑的操作者(<代码>&>-->通过按左对手方式评价这些编号/代码/代码>,而不去做任何其他事情。 然而,由于位居优先,我们知道true >true ́ ́s real &&虚假而不是false : ......

  true || true && false
→ true || (true && false)
→ true || false
→ true

而不是

  true || true && false
↛ (true || true) && false
→ true && false
→ false

<><>>>>>> 实际上,我们也可以同时从理论上评估运营商的双方,但现在这种评估并不重要,当然对C来说是没有意义的。 这导致了更灵活的施舍,但存在副作用的问题(何时发生)。

问题回答

<代码>&& 高于>>>>>>。

(侵扰和搜查;真实的阴道、假和假装;假冒)经过“搜查”评估;“搜查”具有更高的优先地位。

TRUE && TRUE = True

FALSE && FALSE = False

True || False = True

Update:

1&&1||infiniteLoop()&&infiniteLoop()

为什么在C++中出现这种情况?

和以前一样,让我们打破分歧。 &&有更高的优先位置,即C++的短路短波和洋流。

1 && 1 = True.

当 b价值转换为 in升值时,

false -> 0
true -> 1

这一表述评价了这种(真实)和“和”的表述,即短路“The >,从而阻止了在限定时间内的休息。 正在编纂更多的陪审团,因此,对这种情况的简单看法就足够了。

NON-short 电路环境 这一表述永远不会被放弃,因为OR的双方都将“被评价”,右侧将hang。

如果你重新混淆了优先程度,那么,如果“......”、“......”、“......”、“......”、“......”、“......”、“......”、“......”?

1st.) True || False = True
2nd.) True && 1st = True
3rd.) 2nd && false = false
Expression = False;

我可以记住,如果它有权利离开或放弃权利,那么结果就是一样的。 在你的第二个岗位上,如果是< >高端:

1st.) 1||InfLoop();  Hang forever, but assuming it didn t
2nd.) 1 && 1st;
3rd.) 2nd && InfLoop(); Hang Forever

<>strong>tl;dr: 制作“灯”和“灯”;首先进行评价,但汇编者还短路播放OR。 实质上,汇编者将这种业务顺序归类(SIMLISTIC VIEW,第down<>>。 The pitchforks :-P

1st.) Is 1&&1 True?
2nd.) Evaluate if the Left side of the operation is true, 
      if so, skip the second test and return True,
      Otherwise return the value of the second test(this is the OR)
3rd.) Is Inf() && Inf() True? (this would hang forever since 
      you have an infinite loop)

Update #2: "However, this example proves && DOES NOT have precedence, as the || is evaluated before the second &&. This shows that && and || have equal precedence and are evaluated in left-to-right order."

“If && 优先评价第一个和计划;& (1),然后评价第二个和计划;& (有限住所)并保留方案。 由于这种情况没有发生,因此在进行“|”之前没有进行评估。

Let s cover these in detail.

在这里,我们再谈两个不同的问题。 确定业务秩序的预留和短档,这是为节省处理器周期而进行汇编/语文的切片。

Let s cover Precedence first. Precedence is short hand for "Order of Operations" In essence, given this statement: 1 + 2 * 3 in which order should the operations be grouped for evaluation?

数学明确规定,操作顺序比增加多。

1 + (2 * 3) = 1 + 2 * 3
2 * 3 is evaluated first, and then 1 is added to the result.
* has higher precedence than +, thus that operation is evaluated first.

现在,让人们转向风气表达方式:(&& = 和, Kluwer = OR)。

true AND false OR true

C++ 具有高于或高于其他标准的地位,

(true AND false) OR true
true AND false is evaluated first, and then 
      used as the left hand for the OR statement

因此,就在顺序上运行(真实和安插;真实的|、假和假装);

((true && true) || (false && false)) = (true && true || false && false)
1st Comparison.) true && true
2nd Comparison.) false && false
3rd Comparison.) Result of 1st comparison || Result of Second

With me thus far? Now lets get into Short Circuiting: In C++, Boolean statements are what s called "short circuited". This means that the compiler will look at a given statement a choose the "best path" for evaluation. Take this example:

(true && true) || (false && false)
There is no need to evaluate the (false && false) if (true && true) 
equals true, since only one side of the OR statement needs to be true.
Thus, the compiler will Short Circuit the expression.  Here s the compiler s
Simplified logic:
1st.) Is (true && true) True?
2nd.) Evaluate if the Left side of the operation is true, 
      if so, skip the second test and return True,
      Otherwise return the value of the second test(this is the OR)
3rd.) Is (false && false) True? Return this value

如你能看到,如果(真实和真实的)西非经货联盟得到评估,那么,如果(假装和假装)真的,就没有必要使用24小时周期评价。

C++ 短短环,但其他语文为所谓的“Eager”操作者提供机制。

例如,在Ada, “AND”和“OR”是“Eager”的操作者。

In Ada (true AND true) OR (false AND false) would evaluate both (true AND true) and (false AND false) before evaluating the OR. Ada Also gives you the ability to short circuit with AND THEN and OR ELSE, which will give you the same behavior C++ does.

我希望能充分回答你的问题。 否则,让我知道:-

<><>Update 3: 如果你再次提出问题,我就继续在电子邮件上分发。

“如果出现短路,就会发生,并且执行第二及厅的短路;以及说,这意味着“E”的操作员被处执行,第二和安放;操作员。 这意味着对“安放”和“安放”进行左对右执行;以及“安”和“安乐”;

接下来要看这个例子:

(false && infLoop()) || (true && true) = true (Put a breakpoint in InfLoop and it won t get hit)
false && infLoop() || true && true = true  (Put a breakpoint in InfLoop and it won t get hit)
false || (false && true && infLoop()) || true = false (infLoop doesn t get hit)

If what you were saying was true, InfLoop would get hit in the first two. You ll also notice InfLoop() doesn t get called in the third example either.

现在请看一下:

(false || true && infLoop() || true);

Infloop叫! 如果其他资源的预设率高于“备份”;“备份”,则汇编者将评估:

(false || true) && (infLoop() || true) = true;
(false || true) =true
(infLoop() || true = true (infLoop isn t called)

但是,InfLoop被叫! 这就是为什么:

(false || true && infLoop() || true);
1st Comparison.) true && InfLoop() (InfLoop gets called)
2nd Comparison.) False || 1st Comp (will never get here)
3rd Comparison.) 2nd Comp || true; (will never get here)

Precendece ONLY sets the grouping of operations. In this, && is greater than ||.

true && false || true && true gets grouped as
(true && false) || (true && true);

The Compiler Then出现并确定了它应当执行评价的顺序,以便它有最佳的储蓄周期。

Consider: false && infLoop() || true && true
Precedence Grouping goes like this:
(false && infLoop()) || (true && true)
The compiler then looks at it, and decides it will order the execution in this order:
(true && true) THEN || THEN (false && InfLoop())

这是一种事实,我不知道如何证明这一点。 优先程度由文法规则确定。 汇编者优化由每个汇编者确定,有些比其他汇编者更好,但All可自由调整分类的比较,因为它认为适当,以给其最快的“最佳”执行机会。

两个事实解释了这两个例子的行为。 首先,<代码>&& 页: 1 第二,逻辑操作者都使用短路评估。

优先程度往往与评价顺序一致,但独立。 只要最终结果正确,该表述就可按任何顺序对其各个要素进行评估。 一般来说,对于一些经营者来说,这意味着,只要在适用操作者之前对所剩价值进行评估,就可以在权利价值之前或之后对所剩价值进行评估。

合乎逻辑的运营商有特殊财产:在某些情况下,如果一方对特定价值进行评估,那么无论对方的价值如何,经营人的价值都知道。 为使这一财产有用,C语(以及延伸的每一种类似C的语文)指定了合乎逻辑的操作者在RHS之前对LHS进行评估,并且如果RHS的价值为 要求<> > > /em”了解运营商的结果,则对其进行评估。

因此,假定<代码>TRUE和>FALSE的通常定义,TRUE & TRUE ́ ; FALSE从左边开始评价。 第一个<代码>TRUE http://www.un.org/french/ga/president 如今, >/code>知道其《生命和健康分类》。 更糟的是,其《生命和健康分类》迫使人们了解>、<>>>/code>的结果,从而对其整个《生命和健康分类》进行评价。

第二种情况适用同样的评价顺序。 由于<编码>、<>>>>> 编码与否,因此没有经过评估,因此没有打上<代码>。

这种行为是设计的,也是有用的。 例如,你可以写上<条码>p &&p->next,知道这一表述永远不会试图贬低全国人民力量的某一点。

rel=“nofollow noretinger”>higherpha/a>。

“如果出现短路,就会发生,并且执行第二及厅的短路;以及说,这意味着“E”的操作员被处执行,第二和安放;操作员。 这意味着对“安放”和“安放”进行左对右执行;以及“安”和“安乐”;

情况并非如此。

(xx && yy || zz && qq)

Would be evaluated like this:

  1. Check first operator.
  2. Evaluate xx && yy
  3. Check next operator.
  4. If next operator is ||, and the first part of the statement is true, skip the rest.
  5. Otherwise, check for next operator after ||, and evaluate it: zz && qq
  6. Finally, evaluate ||.

根据我的理解,C++的设计是为了在开始评价之前阅读内容。 毕竟,就我们而言,它不知道我们有第二条<代码>和 办公室;和; 在<代码>>后核对,直至其行文为止,也就是说,在进入第二个<代码>和>之前,必须读到>。 因此,如果对第一部分进行评价,则在>后获得部分评价,但如果第一部分评价错误,则第一部分评价无效,则第一部分,在>>>、<>>>>>> 和(......) 编码中读取,对第二部分进行评价,并利用第二部分的结果确定最终结果。

关于你的编辑:由于真实的“真实”——永远是真实的——Loop(tever)获得评价。 如果执行任何措施,则使用真实的“白盔”。

关于<代码>true && real ́ ́finiteLoop( &);& infiniteLoop()/code>,由于两种特性的结合,两个独一无二的通话均未得到评价:和amp;在左边是真实的时,其排在Landamp; 排在Landamp; 排在路边; 排在路边是左边。

如果和计划,以及评价是否具有同样的优先地位,那么:

((( true && true ) || infiniteLoop ) && infiniteLoop )
(( true || infiniteLoop ) && infiniteLoop )
=> first call to infiniteLoop is short-circuited
(true && infiniteLoop) => second call to infiniteLoop would have to be evaluated

but because of && s precedence, the evaluation actually goes

(( true && true ) || ( infiniteLoop && infiniteLoop ))
( true || ( infiniteLoop && infiniteLoop ))
=> the entire ( infiniteLoop && infiniteLoop ) expression is short circuited
( true )

关于安德鲁的最新法典,

#include <iostream>
using namespace std;

bool infiniteLoop () {
    while (true);
    return false;
}

int main() {
    cout << (true && true || infiniteLoop() && infiniteLoop()) << endl; // true
}

短路评估意味着,保证不执行<代码>的专用Loop

然而,由于C++0x草案使“无限-选择--选择” 未定义的 Behavior,它以相反的方式令人感兴趣。 这一新规则通常被视为非常不可取和顽固的,甚至是极右的危险,但被打入草案。 部分从阅读假想的考虑来看,如果一份文件的作者认为,这将简化对某种或其它内容的规则。

因此,如果一个汇编者在C++0x-conformance的“领先优势”上填写,则方案可以终止,结果如下: ~em>,即使它执行了一项关于<条码>的号召。 当然,如果是这样的汇编者,它也可以产生这种可怕的现象。

值得注意的是,如上所述,短路评估意味着这些呼吁得不到执行。

Cheers & hth.,

由于和(或)/真实/数字与*/+/1/0(数学等同)非常相似,下列情况也属实:

1 * 1 + 0 * 0 == 1

并且很容易记住......

因此,它必须使用短路。 如果你将其描绘成与其对应的愤怒相处,那么大眼镜的流行就非常容易。

简单的答复是“和”;“和” ;高于>。 此外,该法典还没有得到执行,因为不需要知道大毛主义表达的结果。 是的,它是优化汇编。

这是一系列的例证:

  (true && true || false && false)
= ((true && true) || (false && false))  // because && is higher precedence than ||, 
                                        //   like 1 + 2 * 3 = 7  (* higher than +)
= ((true) || (false))
= true

但也指出,如果是,

(true || ( ... ))

因此,对右侧没有进行评价,因此没有要求任何职能,这一表述将只是返回<条码>。





相关问题
Undefined reference

I m getting this linker error. I know a way around it, but it s bugging me because another part of the project s linking fine and it s designed almost identically. First, I have namespace LCD. Then I ...

C++ Equivalent of Tidy

Is there an equivalent to tidy for HTML code for C++? I have searched on the internet, but I find nothing but C++ wrappers for tidy, etc... I think the keyword tidy is what has me hung up. I am ...

Template Classes in C++ ... a required skill set?

I m new to C++ and am wondering how much time I should invest in learning how to implement template classes. Are they widely used in industry, or is this something I should move through quickly?

Print possible strings created from a Number

Given a 10 digit Telephone Number, we have to print all possible strings created from that. The mapping of the numbers is the one as exactly on a phone s keypad. i.e. for 1,0-> No Letter for 2->...

typedef ing STL wstring

Why is it when i do the following i get errors when relating to with wchar_t? namespace Foo { typedef std::wstring String; } Now i declare all my strings as Foo::String through out the program, ...

C# Marshal / Pinvoke CBitmap?

I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...

Window iconification status via Xlib

Is it possible to check with the means of pure X11/Xlib only whether the given window is iconified/minimized, and, if it is, how?