![]() |
1
17
C:从左到右,如果发现不匹配(计算结果为假),处理将停止。 |
![]() |
2
9
C:从左到右,如果找到匹配项(计算结果为真),则停止处理。 僵尸羊是错误的,没有足够的代表投反对票。 问题是关于&operator,而不是operator。 如果发现错误,评估将停止。 如果计算结果为真,则停止。 |
![]() |
3
8
我知道这个问题已经被回答了,但是我想再加一点与这个主题相关的信息。 在像C++这样的语言中,实际上你可以重载放大器和运算符的行为,强烈建议你使用。 不要这样做 . 这是因为当您超载这种行为时,最终会强制对操作的两侧进行评估。这有两件事:
更多信息,请阅读斯科特·梅耶斯的书, More Effective C++ . 干杯! |
![]() |
4
6
运动模拟
您可以使用 和 而不是VB中的andalso。在这种情况下,左侧也会先进行评估,而右侧则会进行评估,而不管结果如何。 最佳实践:总是使用andalso,除非你有很好的理由不这样做。 在后续调查中,有人问为什么或何时会有人使用Andalso而不是Andalso(或&而不是&&): 下面是一个例子:
在这种情况下,我想初始化x和y。y必须初始化,y.dodance才能执行。但是,在init()函数中,我还做了一些额外的事情,比如检查一个套接字是否打开,并且只有当它正常工作时,对于 二者都 ,我应该继续做x.process(y)。 同样,在99%的情况下,这可能是不需要的,也不优雅,这就是为什么我说默认应该使用 而且 . |
![]() |
5
5
@希斯特默
这不是运算符重载。运算符重载是一个术语,用于定义运算符的自定义行为,如*、+、=等。 这将允许您编写自己的“日志”类,然后
这样做
实际上被称为 Short Circuit Evaluation |
![]() |
6
4
僵尸死掉了。唯一可能等待的“抓住机会”是,只有当您使用&运算符时,这才是正确的。使用&运算符时,无论一个或两个表达式的值是否为false,都将每次对这两个表达式进行计算。
|
![]() |
7
4
请注意,&和&之间在计算表达式的多少方面存在差异。 &&被称为短路布尔值,并且,如这里的其他人所指出的,如果在计算所有子表达式之前可以确定结果,那么将提前停止。 &被称为逻辑位运算符,将始终计算所有子表达式。 像这样的:
只会呼叫 乙 如果 一 收益率 真 . 然而,这:
将始终调用两者 一 和 乙 ,即使调用的结果 一 是虚假的,因此被认为是 假 不管调用结果如何 乙 . 对于和操作符,也存在相同的差异。 |
![]() |
8
4
有些语言有有趣的情况,即表达式以不同的顺序执行。我特别想到了Ruby,但我确信他们是从其他地方(可能是Perl)借用的。 逻辑中的表达式将保持从左到右,但例如:
上面将评估“message.nil?”首先,如果它的计算结果为假(除非它在条件为假而不是真时执行),则将执行“放置消息”,将消息变量的内容打印到屏幕上。 有时候这是一种很有趣的方法来构造代码…我个人喜欢把它用在像上面这样很短的一行。 编辑: 为了更清楚一点,上述内容与以下内容相同:
|
![]() |
9
2
左边一个,如果为空则停止。 编辑:在vb.net中,除非使用andalso,否则它将同时计算并可能引发错误。 |
![]() |
10
2
谦虚的概念指的是运算符重载。在声明中:
首先对a进行计算,如果其计算结果为false,则从不对b进行计算。同样适用于
首先计算a,如果它的计算结果为真,则从不计算b。 这个概念,即重载,适用于(我认为)所有C风格的语言,以及许多其他语言。 |
![]() |
11
1
不,至少C编译器不会向后工作(在&&或中)。从左到右。 |
![]() |
12
1
当一切都在一条直线上时,就会从左到右执行。 当事物被嵌套时,它们是从内到外执行的。这可能像通常一样让人困惑,“最里面的”在行的右边,所以看起来好像是在倒退…… 例如
事情就是这样发生的:
|
![]() |
13
1
我喜欢猎户座的反应。我将添加两个内容:
假设我们有以下示例:
执行顺序如下:
我不能谈论C的法律要求(虽然我在编写这篇文章之前使用MNO来测试一个类似的例子),但是这个命令是用Java来保证的。
只是为了完整性(因为这也是一个语言不可知线程),有语言,如C和C++,其中的顺序不能保证,除非有一个序列点。参考文献:
1
,
2
. 然而,在回答线程的问题时,
在
|
![]() |
14
1
假设您有标记,比如文件属性。假设您将read定义为4,write定义为2,exec定义为1。在二进制中,这是:
每个标志都有一个位集,并且每个位都是唯一的。位运算符允许您组合这些标志:
|
![]() |
15
0
我在某个地方听说编译器是向后工作的,但我不确定这是多么真实。 |
![]() |
16
0
当您特别想评估所有子表达式时,您可以使用&因为它们有您想要的副作用,即使最终结果是 假 因此不执行 然后 你的一部分 如果 -声明。 请注意,&和对位掩码和布尔值都进行操作,而不仅仅是对位操作。他们是 打电话 按位,但它们都是为C中的整数和布尔数据类型定义的。 |
![]() |
17
0
@csmba :
我认为这相当令人困惑。虽然您的示例有效,但它不是使用
|
![]() |
18
0
D编程语言可以
left-to-right evaluation with short circuiting
和
doesn't
允许重载
|