首页 / 知识
关于不可知的语言:C#逻辑顺序和编译器行为
2023-04-11 20:37:00

C# logic order and compiler behavior在C#中,(对于其他语言,可以随意回答),运行时按什么顺序评估逻辑语句? 例:
运行时首先评估哪个语句-
要么:
? 是否有一段时间编译器会向后评估该语句? 也许当涉及到"或"运算符时?
何时使用按位运算符代替"短路布尔值"的一个好例子是什么? C#:从左到右,如果发现不匹配(评估为false),则处理停止。 " C#:从左到右,如果找到匹配项(评估为true),则处理停止。" 僵尸羊是错的,没有足够的代表来拒绝投票。 问题是关于&&运算符,而不是||。运营商。 在&&的情况下,如果找到FALSE,评估将停止。 对于||如果找到TRUE,则评估停止。 我知道这个问题已经得到解答,但是我想补充一点与该主题相关的信息。 在C ++之类的语言中,实际上您可以重载&&和||的行为。运算符,强烈建议您不要这样做。这是因为当您超载此行为时,您最终将迫使对操作双方进行评估。这有两件事: 有关更多信息,请阅读Scott Meyers的书《更有效的C ++》。干杯! vb.net
您可以在vb中使用And代替AndAlso。在这种情况下,左侧也将首先被评估,但是无论结果如何,右侧都将被评估。 最佳实践:始终使用AndAlso,除非您有很好的理由不这样做。
在后续活动中,有人问为什么或何时将有人使用And代替AndAlso(或&代替&&):
在这种情况下,我想同时初始化X和Y。为了使y.DoDance能够执行,必须初始化Y。但是,在init()函数中,我还执行其他一些操作,例如检查套接字是否打开,并且只有在工作正常的情况下,我才应该继续执行x.process(y)。 同样,在99%的情况下,这可能不是必需的,也不是很优雅,这就是为什么我说默认应该使用AndAlso。 @shsteimer
这不是运算符重载。运算符重载是一个术语,用于让您定义运算符的自定义行为,例如*,+,=等。 这样您就可以编写自己的" Log"类,然后执行
这样做
实际上称为短路评估 某些语言在有趣的情况下会以不同的顺序执行表达式。我特别在考虑Ruby,但是我确定他们是从其他地方(可能是Perl)借来的。 逻辑中的表达式将保持从左到右,但是例如:
上面将评估" message.nil?"首先,然后,如果它的计算结果为false(除非与条件条件为false而不是true时执行一样),将执行" puts message",这会将message变量的内容打印到屏幕上。 有时候,这是一种有趣的结构化代码的方式...我个人喜欢将其用于非常短的1个上述代码。 编辑: 为了更清楚一点,以上内容与以下内容相同:
ZombieSheep已经死了。可能正在等待的唯一"陷阱"是,仅当您使用&&运算符时,这才是正确的。使用&运算符时,每次都会对这两个表达式进行求值,而不管一个或两个求值为false。
请注意,&&和&之间在计算表达式的多少方面有所不同。 &&被称为短路布尔AND,如此处其他人所述,如果可以在评估所有子表达式之前确定结果,它将尽早停止。 &被称为逻辑按位运算符,它将始终评估所有子表达式。 因此:
如果a返回true,则只会调用b。 但是,这:
即使调用a的结果为false,因此无论调用b的结果如何,都将始终调用a和b。 ||存在相同的差异和|运营商。 谦虚是指操作员重载。在声明中:
首先评估A,如果评估为假,则永远不会评估B。同样适用于
首先评估A,如果评估为true,则永远不会评估B。 重载这个概念适用于(我认为)所有C样式语言以及许多其他语言。 左边的为空,然后停止。 编辑:在vb.net中,它将同时评估这两者并可能引发错误,除非您使用AndAlso
假设您有标志,例如文件属性。假设您已将READ定义为4,将WRITE定义为2,将EXEC定义为1。在二进制文件中,即:
每个标志设置一个位,并且每个标志都是唯一的。按位运算符使您可以组合以下标志:
当所有事情都在线时,它们从左到右执行。 当事物嵌套时,它们从内到外执行。这似乎令人困惑,因为通常"最内层"位于该行的右侧,因此似乎向后退了。 例如
事情像这样发生:
我喜欢猎户座的回应。我将添加两件事: 假设我们有以下示例:
执行顺序如下: 我无法谈论C#的法律要求(尽管在撰写本文之前,我曾使用Mono测试过类似的示例),但是Java保证了此顺序。
仅仅为了完整性(因为这也是与语言无关的线程),还有C和C ++之类的语言,除非有序列点,否则无法保证顺序。参考:1、2。但是,在回答线程的问题时,
在 不,至少C#编译器不会向后工作(在&&或||中)。从左到右。
D编程语言在进行短路时从左至右进行评估,并且不允许 当您特别想评估所有子表达式时,可以使用&,这很可能是因为它们具有所需的副作用,即使最终结果将为假,因此也不会执行if语句的then部分。 请注意&和|不仅适用于按位运算,还适用于按位掩码和布尔值。它们被按位调用,但是在C#中为整数和布尔数据类型定义了它们。 我在某处听说编译器会向后工作,但我不确定这是多么真实。 @csmba:
我相信这很令人困惑。 尽管您的示例有效,但这不是使用
|
最新内容
相关内容
pythonfor循环语句怎么写
pythonfor循环语句怎么写,数据,培训,项目,语句,循环体,实例,教程,时会,字符串,序列,pythonfor循环可以遍历任何序列的项目,如一个列表或者一个pythonelif语句报错是什么原因
pythonelif语句报错是什么原因,培训,语句,数据,条件,程序,结果,内容,变量,使用方法,更多,python的else和elif语句也可以叫做子句,因为它们不能python代码如何在命令行运行
python代码如何在命令行运行,代码,培训,路径,空格,文件,下面,以上,目录,更多,内容,我们在编写python代码时,可以在交互模式下运行代码,也可以用pythonpython是前端语言吗?
pythonpython是前端语言吗?,代码,互动,培训,平台,标准,设计,语言,前端,语法,解释性,python语言属于后端开发语言。Python是一个高层次的结合python用什么编译器
python用什么编译器,代码,平台,工具,环境,培训,灵活,时间,管理,系统,智能,Python的学习过程少不了IDE或者代码编辑器,或者集成的开发编辑器(IDpythonpython是什么类型的语言
pythonpython是什么类型的语言,培训,系统,教育,软件,电脑,代码,简介,人工智能,类型,语言,python是一种面向对象、解释型、动态类型计算机程序python如何使用return语句
python如何使用return语句,地址,位置,情况,培训,函数,分析,控制权,地方,变量,语句,return语句就是讲结果返回到调用的地方,并把程序的控制权一python脚本语言
python脚本语言,代码,设计,情况,培训,语句,项目,基础,意外,异常,空格,Python是一种计算机程序设计语言。是一种面向对象的动态类型语言,最初被python为什么是胶水语言
python为什么是胶水语言,代码,标准,培训,环境,一致,系统,统一,数据,周期性,服务,胶水语言先从Helloworld开始。所有学python的童鞋都会从这句python如何用import语句
python如何用import语句,培训,名称,代码,标准,函数,模块,语句,前缀,形式,程序,Python程序可以调用一组基本的函数(即内建函数),比如print()、ipythonif语句是什么
pythonif语句是什么,代码,培训,语句,情况,概念,测试,条件,表达式,后面,关键字,本文主要介绍python中的if语句以及简单使用1条件测试(1)概念:每pythonpython是脚本语言吗?
pythonpython是脚本语言吗?,设计,培训,大规模,项目,软件,面临,开发者,语言,脚本语言,方法,Python是脚本语言。python是一种计算机程序设计语