银河

SKYIV STUDIO

  博客园 :: 首页 :: 博问 :: 闪存 :: :: :: 订阅 订阅 :: 管理 ::
  268 随笔 :: 2 文章 :: 2616 评论 :: 140万 阅读
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

谜题04: 初级问题
    下面的程序只涉及加法,它又会打印什么呢?
    class Elementary
    {
      static void Main()
      {
        System.Console.WriteLine(12345 + 5432l);
      }
    }

解惑04: 初级问题
    从表面上看,这像是一个简单的谜题——简单到不需要纸和笔你就可以解决它。加号的左操作数的各位是从1到5升序排列的,而右操作数是降序排列的。因此,相应各位的和仍然是常数,程序必定打印66666。对于这样的分析,只有一个问题:当你运行该程序时,它打印的是17777。难道C#对打印这样的非常数字抱有偏见?不管怎么说,这看起来并不像是一个合理的解释。
    事物往往有别于它的表象。以这个问题为例,它并没有打印我们想要的输出。请仔细观察+操作符的两个操作数。我们是将一个int类型的12345加到了long类型的5432l上。请注意左操作数开头的数字1和右操作数结尾的小写字母l之间的细微差异。数字1的水平笔划(称为“臂(arm)”)和垂直笔划(称为“茎(stem)”)之间是一个锐角,而与此相对比的是,小写字母l的臂和茎之间是一个直角。
    在大喊“恶心!”之前,你应该注意到这个问题确实已经引起了混乱,还应该注意到这个谜题的题目已经包含了一条暗示:初级问题(El-ementary),看到了吗?最后,应该注意到这里确实有一个教训:在long类型字面常量中,一定要用大写的L,千万不要用小写的l[C#语言规范 2.4.4.2]。这样就可以彻底清除这个谜题所产生混乱的源头。
    System.Console.WriteLine(12345 + 5432L);
    相类似的,要避免使用单个l字母作为变量名。例如,我们很难通过观察下面的代码段来判断打印的是列表l还是数字1。
    // Bad code-uses el(l)as a variable name
    List<string> l = new List<string>();
    l.Add("Foo");
    System.Console.WriteLine(1);
    总之,小写字母l和数字1在大多数打字机字体中几乎一样。为避免程序的读者对二者产生混淆,千万不要使用小写的l作为long型字面常量的结尾或是作为变量名。C#从C编程语言中继承良多,包括long型字面常量的语法。也许当初允许用小写的l来编写long型字面常量本身就是一个错误。
    (注:C#编译器有警告: warning CS0078: “l”后缀容易与数字“1”混淆;为清楚起见,请使用“L”)


    C#解惑总目录

posted on   银河  阅读(865)  评论(5编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述
点击右上角即可分享
微信分享提示