懒惰评估不那么懒惰吗?

2024-04-30

我一直听说 C# 使用惰性求值。所以对于某些代码,比如if (true || DoExpensiveOperation()将返回true不执行DoExpensiveOperation().

在面试测试中我看到了以下问题,

static bool WriteIfTrue(bool argument)
{
    if (argument)
    {
        Console.WriteLine("argument is true!");
    }

    return argument;
}

static void Main()
{
    // 1              0                       0                 1
    WriteIfTrue((WriteIfTrue(false) & WriteIfTrue(true)) || WriteIfTrue(true));

    // 1               1                     0                      1
    WriteIfTrue((WriteIfTrue(true) || WriteIfTrue(false)) & WriteIfTrue(true));

    //  0                 0                  0                    0
    WriteIfTrue((WriteIfTrue(false) & WriteIfTrue(true)) & WriteIfTrue(false));

    // 1                1                      0                   1
    WriteIfTrue((WriteIfTrue(true) || WriteIfTrue(false)) & WriteIfTrue(true));
}

它会打印多少次“argument is true!”到屏幕上?

我会说7是正确的答案。现在,如果我坚持编译器并运行它,它会打印它10次!惰性评估到底错在哪里?


我一直听说 C# 使用惰性求值。

这个评论太模糊了,我无法同意。如果你说的是|| and &&C# 中的运算符是短路的,如果仅从第一个操作数无法确定总体结果,则仅计算第二个操作数,then我同意。惰性求值是一个更广泛的概念 - 例如,LINQ 查询使用惰性(或延迟)求值,在使用结果之前不会实际获取任何数据。

您正在使用, which isn't短路:

& 运算符计算两个运算符,无论第一个运算符的值如何。

The is短路:

操作x && y对应操作x & y除了如果x是假的,y不进行计算,因为无论 AND 运算的值是什么,结果都是 falsey is.

Replace & with &&在代码中的任何地方,您都会看到“argument is true!”打印了 8 次(不是 7 次 - 再次计算您的评论)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

懒惰评估不那么懒惰吗? 的相关文章

随机推荐

  • Vagrant 的端口转发不起作用[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我在最后遇到了一个小问题入门指南vagrant http vagrantup com docs getting started ports html
  • 可滚动 Turbo 表中的 PrimeNG 过滤器下拉问题

    在 prime ng Turbo Table 中 当我们将过滤器下拉列表放入表内的可滚动表下拉列表中时 没有可滚动表下拉菜单就完美了 这工作完美 https i stack imgur com 16vjy png 但是当可滚动表格时 下拉菜
  • gdi+ 中的半色调效果

    我该如何去模仿this http www juicybitssoftware com halftone GDI 中的半色调效果 它几乎看起来像弗洛伊德 斯坦伯格 http en wikipedia org wiki Floyd E2 80
  • Android TextView 更改文本大小后不调整大小

    我有一个ListView对该行进行一些自定义布局 一张图像 然后使用两个TextView在垂直方向上LinearLayout 参见下面的代码 我的问题是 当我动态更改文本大小时 在getView的方法Adapter 文字大小确实改变了 但是
  • Java中StringBuilder如何逆向工作?

    我正在尝试解决这个leetcode问题https leetcode com problems palindrome linked list https leetcode com problems palindrome linked list
  • java-websocket的WebSocketServer使用什么草案?

    我无法从WebSocketServer java源码 https github com TooTallNate Java WebSocket blob master src main java org java websocket serv
  • 生成实体密钥

    我第一次对 Entity Framework 4 感到失望 事实证明 当 SQL CE 与 EF4 一起使用时 不支持自动生成主键 http social msdn microsoft com forums en US sqlce thre
  • 二分图中最小顶点覆盖算法

    我正在尝试找出一种算法来查找二分图的最小顶点覆盖 我正在考虑一个解决方案 将问题减少到二分图中的最大匹配 众所周知 可以使用从 bip 创建的网络中的最大流量来找到它 图形 最大匹配 M 应确定最小匹配 顶点覆盖 C 但我无法处理选择顶点来
  • 关于 JavaScript for() 循环巫毒

    在相当长的一段时间里 我一直有这样的印象 for循环可能存在solely采用以下格式 for INITIALIZER STOP CONDITION INC DEC REMENTER CODE 然而 这是最绝对事实并非如此 看看这个 Java
  • `SwaggerRequestExample` 被忽略

    当我向 API 添加 swagger 时 我想要获取默认值和响应示例 我添加了 NuGet 包并尝试遵循本教程 https mattfrear com 2016 01 25 generating swagger example reques
  • Shell Linux:grep 带有 NULL 字符的精确句子

    我有一个像这样的文件 key 0value n akey 0value n key2 0value n 我必须创建一个以单词作为参数的脚本 我必须返回具有与参数完全相同的键的每一行 I tried grep aF key x0 但 grep
  • python raw_input 带有包含字符串的重音符号的奇怪行为

    我正在编写一个程序 要求用户输入包含重音符号的输入 测试用户输入字符串以查看其是否与程序中声明的字符串匹配 如下所示 我的代码无法正常工作 code coding utf 8 testList m myInput raw input ent
  • 有没有办法在网站中嵌入维基百科文章并设置其样式?

    我想做的基本上是一个 div 元素 其中包含维基百科文章的打印友好版本 我使用 iframe 来嵌入文章并且它可以工作 尽管我无法设置文档的样式 我想这是因为 iframe 内容不在我的域中并且我没有编辑权限 有没有办法在加载 iframe
  • NPM 安装“在 M1 芯片上找不到模块‘node-darwin-arm64/package.json’”

    我知道这个问题已经被问到了不同的版本 但我还没有看到一个不涉及使用 Rosetta 安装或使用 zsh 伪造架构的解决方案 我使用 bash 并希望尽可能不处理 Rosetta 我是一个节点新手 正在努力找出失败的原因 节点 v16 14
  • 使用 ajaxFileUpload 上传具有不同文件 ID 的多个文件

    我正在尝试以同一表单上传多个文件 多个文件应该位于不同的字段中 我对单个文件使用 ajaxfileuploader 并使用 MultipartHttpServletRequest 接收它 它成功了 I used ajaxFileUpload
  • 如何使用 Vapor 3 处理多部分请求

    我是一名 Vapor 初学者 我选择从 Vapor 3 rc 开始 因为它似乎破坏了 Vaport 2 的更改 不幸的是 目前还没有完整的文档 我目前正在尝试将一个简单的 txt 文件从 Postman 上传到我的 Vapor 3 本地服务
  • 使 QLabel 可点击

    我有一个充满 QPixmap 的 Qlabel 我想在单击该标签后启动一个进程 函数 我扩展了 QLabel 类 如下所示 from PyQt5 QtCore import from PyQt5 QtWidgets import from
  • python celery - 导入错误:没有名为 _curses 的模块 - 尝试运行 manage.py celeryev 时

    背景 视窗 7 x 64 Python 2 7 姜戈1 4 Celery 与 Redis 捆绑包 在尝试运行 manage py celeryev 时 我在终端中收到以下错误 import curses File c Python2 lib
  • 使用 LinkedIn REST API 更新个人资料

    是否可以通过 LinkedIn API 更新个人资料的教育 专业和 或经验 我可以正常进行正常的 GET 调用 我在这里问是因为他们网站上的文档没有产生任何结果 而 Stackoverflow 会有更多的实践经验 编辑 进一步的搜索使我发现
  • 懒惰评估不那么懒惰吗?

    我一直听说 C 使用惰性求值 所以对于某些代码 比如if true DoExpensiveOperation 将返回true不执行DoExpensiveOperation 在面试测试中我看到了以下问题 static bool WriteIf