【问题标题】:b = false vs if (b) b = falseb = 假 vs 如果 (b) b = 假
【发布时间】:2012-11-10 22:26:56
【问题描述】:

我正在处理 test.c 文件并尝试计算其中的单行 cmets。

当我发现两个连续的/ 字符时,我将slc 触发器设置为true

当我到达行尾时,我需要将slc触发器设置为false

当然\n字符清楚地表明了单行注释的结束。

switch (character)
{
    case '\n':
        slc = false; // single-line comment ended
        break;

但是当找到\n 字符时,slc 可能是truefalse

switch (character)
{
    case '\n':
        if (slc) slc = false; // single-line comment ended
        break;

这两个代码块有什么区别吗?

我应该怎么写?

【问题讨论】:

  • 对于第一个代码,您应该更改注释,// no single-line comment from here 或其他内容,因为换行符不需要结束。
  • 唯一的区别是,如果你关闭优化器,后者会生成更多的代码......行为将是相同的。这不是很明显吗? slc 在语句末尾必然为假。
  • @JimBalter 对我来说不是那么明显。我不确定哪种操作对计算机来说更容易:为变量分配一些新值,或者检查一些条件。
  • 这些都不是您在编写代码时应该考虑的事情。微优化是制作极快、极难维护、漏洞百出的代码的绝妙方法。让编译器完成工作;将优化重点放在您使用的算法上。在分析器告诉您需要以及在何处进行优化之前,切勿进行优化。
  • 我问行为是否相同是否不明显,但您回答“对计算机更容易”,这是一个不同的主题。这也很奇怪……如果您的意思是“哪个操作更快”,那么就这么说吧。事实是,在现代计算机上只做作业要快得多。不可预测的分支很烂。

标签: c if-statement boolean switch-statement case


【解决方案1】:

使用第一种形式。添加一个额外的if 检查不会影响代码的功能,只会影响它的可读性,这是不好的做法。您应该始终以最简洁的方式编写不会混淆代码意图的方式。由于在这种情况下,您的意图始终是变量为false,因此只需设置slc = false

【讨论】:

  • 谢谢!其实,这只是兴趣,计算机会有什么不同。编译器会添加一个条件来检查变量状态吗?
  • 如果你想绝对确定,两种方式都写,然后反汇编二进制文件看看编译器做了什么。我怀疑它会优化检查,除非你禁用优化。检查slc 的值至少需要几个时钟周期,而且如果随意执行线程预测和流水线,必须使用jmp 指令可能会很粗糙。
  • 只要用-S编译就可以得到汇编代码;无需拆卸。通过优化(例如 -O2),这两种方法将完全相同。
  • @EdwardRuchevits “计算机会有什么不同”——排序有什么不同?行为将是相同的。 “编译器会添加一个条件来检查变量状态吗?” -- 如果slc 被声明为volatile,它肯定会。否则,它可能会或可能不会,即使你告诉它。
【解决方案2】:

排名靠前的人可以解决问题,为什么还要麻烦if

【讨论】:

    猜你喜欢
    • 2011-01-20
    • 2020-02-14
    • 1970-01-01
    • 1970-01-01
    • 2011-01-30
    • 2012-07-26
    • 2012-01-25
    • 1970-01-01
    • 2019-03-14
    相关资源
    最近更新 更多