If statement if-then-else运算符的短路评估(例如?:在C中)

If statement if-then-else运算符的短路评估(例如?:在C中),if-statement,operators,lazy-evaluation,short-circuiting,If Statement,Operators,Lazy Evaluation,Short Circuiting,我需要用任何语言编写一个程序,如果该语言在if-then-else运算符中使用短路求值,则会打印1,如果该语言不使用短路求值,则打印0 我的问题是,if-then-else运算符中的短路评估是什么意思 这仅仅是发生在&&和| |运算符中的惰性求值吗?如果我正确地阅读了这个问题,那么是的。在实现这一点的语言中,如果您有 if (A || B || C || D) 一旦运行库发现一条为真的语句,它就会停止计算。例如,如果A和B为假,但C为真,则它将计算A、B和C,而不是D。如果您执行以下操作,这一

我需要用任何语言编写一个程序,如果该语言在if-then-else运算符中使用短路求值,则会打印1,如果该语言不使用短路求值,则打印0

我的问题是,if-then-else运算符中的短路评估是什么意思


这仅仅是发生在&&和| |运算符中的惰性求值吗?

如果我正确地阅读了这个问题,那么是的。在实现这一点的语言中,如果您有

if (A || B || C || D)
一旦运行库发现一条为真的语句,它就会停止计算。例如,如果A和B为假,但C为真,则它将计算A、B和C,而不是D。如果您执行以下操作,这一点很重要:

if (a != null && a.ToString() == "abc")
短路行为意味着如果
a
实际上是
null
,则不会执行此if语句的后半部分,这一点非常关键,因为如果不是这样,则此语句可能引发null引用异常。如果不是因为这个,你就得做类似的事情

if (a != null) {
   if (a.ToString() == "abc") {
      // ...
这显然不那么简洁

&&行为方式类似:

if (A && B && C && D) ...
例如,如果
A
false
,为什么还要检查其余的表达式呢


关于赋值,我给你一个提示:如果在其中一个表达式中有副作用,会发生什么?

如果有人面临类似赋值/想知道更多关于C中if运算符短路的信息: 首先,让我们按如下方式标记if运算符的每个部分:

如果(表达)?BlockA:BlockB

现在,在PL C中,在if-then-else运算符短路之后,如果表达式求值为true,则只求值BlockA,否则只求值BlockB


现在假设C不遵循短路,所发生的是无论表达式的计算结果如何,都对BlockA和BlockB进行计算(听起来愚蠢而危险,但显然它就是这样工作的)

谢谢你的解释,只是为了确保我理解正确,下面的代码会起作用吗?int a=0;(1 | |(a=1))?printf(“%d”,1-a):printf(“1”);在C编译器上运行时,它会打印1,因为C使用短路,但如果C没有在if运算符上使用短路,输出将为0,对吗?@SirajOtman我的C有点生锈,我没有坐在IDE前面,但如果我记得正确,“1”将计算为“true”(如果我错了,请纠正我)所以它应该只计算整个字符串。1确实转换为true,但是由于C使用短路,所以它不应该(我也试过)计算整个字符串。我的问题是,如果语言对整个if语句求值,那么输出是否为0?