【问题标题】:What does "compares less than 0" mean?“比较小于 0”是什么意思?
【发布时间】:2018-05-09 22:58:06
【问题描述】:

上下文

在阅读 Consistent comparison 时,我注意到动词 to compare 的特殊用法:

有一个新的三向比较运算符 <=>。表达式a <=> b 返回一个对象,如果a < b 比较<0,如果a > b 比较>0,并且 如果ab 相等/等价,则比较==0

在互联网上找到的另一个例子(重点是我的):

它返回一个在失败时比较小于零的值。否则, 返回的值可以用作以后调用的第一个参数 得到。

最后一个example,在 GitHub 上找到(重点是我的):

// 执行循环 16 位比较。
// 如果两个数之间的距离大于32767,
// 并且数字大于 32768,减去 65536
// 因此,65535 比较小于 0,但大于 65534
// 这会正确处理 65535->0 环绕大小写

当然,对于有经验的程序员来说,意思是很清楚的。但是在这些例子中使用动词to compare的方式在任何标准化的英语形式中都不是标准的。

问题*

  • 编程jargon 句子“对象比较小于零”如何翻译成简单的英语
  • 这是否意味着如果将对象与0 进行比较,结果将“小于零”?
  • 为什么说“对象小于零”而不是“对象比较小于零”是错误的?

* 我在English Language LearnersEnglish Language & Usage 寻求帮助。

【问题讨论】:

  • @NicolBolas “比较小于零”绝对不是“简单的英语”。这种 compare 的含义通常需要语义上的多价结构(通过复数主语、复数 DO 或单数 DO 后跟强制 PC 来表示)。它可能在(一些?)程序员中以这种单价的方式行话,但这并不意味着它是简单的英语。 “X 比较小于零”对于大多数说英语的普通人来说没有任何意义,就像“我的新车比较 55”一样。
  • @NicolBolas 不,不是。那是完全正常的多价用法(尽管在我的第一条评论中忽略指定的结构中,这是理所当然的:具有强制性 PC 的单一主题)。有两种语义动词补语,其中一种表示为 PP。这里引用的情况首先不是“没有对象”的用法:有一个对象,即小于。有一个单一的主题和一个单一的 DO——仅此而已。这不是 compare 的正常结构。您的示例的平行版本是“他的独奏会肯定与他去年的独奏会相比”。
  • @Nicol 仍然没有。首先,这将是一个非常不寻常的小于用法。更重要的是,您通常比较 X to/with Y,无论是否有任何状语(如 否定 或者,如果我们接受它, 小于)。在独奏示例中,您恢复了 C++ 示例中没有的 with ——这就是它如此奇怪的原因。 “他的独奏会与他去年的独奏会相比”仍然没有意义。并且“如果 a
  • @JanusBahsJacquet: "更重要的是,你通常比较 X 和 Y,不管是否有任何状语(比如否定或,如果我们接受它,小于)。” 我会说“小于”作为副词和“to/with” 起作用。 “小于”这个短语已经预设了一个后续对象的存在;无需添加“to/with”。虽然您可能“通常”需要“to/with”,但在这种情况下您不需要。
  • @Nicol 这正是使它成为行话的原因:不能从标准英语中的 less than 之类的短语中推断出这样的预设。用法很可能是 C++ 行话,但它行话,而不是标准/简单的英语。如果我正确理解您的答案,更标准的英语改写将类似于“一个对象,如果与 0 相比,如果 a

标签: c++ terminology comparison-operators c++20 spaceship-operator


【解决方案1】:

“比较

我相信这是一种常见的速记。

因此,将其应用于整个句子给出:

表达式 a b 返回一个比较小于零的对象 如果 a 小于 b,则比较大于零 如果 a 大于 b,如果 a 和 b 相等/等价,则比较等于 0。

这真是一口。我可以理解为什么作者会选择使用符号。

【讨论】:

    【解决方案2】:

    更准确地说,我感兴趣的是“比较

    首先,我们需要了解您引用的内容与标准的实际措辞之间的区别。您引用的内容只是对实际纳入标准的解释。

    P0515 中语言功能 operator&lt;=&gt; 的标准措辞是它返回 5 种可能的类型之一。这些类型由P0768 中的library 措辞定义。

    这些类型不是整数。甚至枚举。它们是类类型。这意味着它们完全具有并且只有库为它们定义的操作。图书馆的措辞对它们非常具体:

    比较类别类型的关系和相等友元函数是用 unspecified 类型的匿名参数指定的。此类型应由实现选择,以便这些参数可以接受文字 0 作为相应的论据。 [示例:nullptr_t 满足此要求。 — end example] 在这种情况下,提供除文字 0 以外的参数的程序的行为是未定义的。

    因此,Herb 的文本被直接翻译成标准措辞:它比较小于 0。不多也不少。不是“是负数”;它是一种值类型,您唯一能做的就是将其与零进行比较。

    请务必注意 Herb 的描述性文本“比较小于 0”如何转换为实际的标准文本。 P0515 中的标准文本清楚地表明1 &lt;=&gt; 2 的结果是strong_order::less。而P0768中的标准文本告诉我们strong_order::less &lt; 0是真的。

    但它也告诉我们,所有其他比较都是描述性短语“比较小于 0”的功能等价物。

    例如,如果 -1 “比较小于 0”,那么这也意味着它不比较等于 0。并且它不会比较大于 0。这也意味着 0 不会比较小于 -1。以此类推。

    P0768 告诉我们strong_order::less 和文字0 之间的关系符合“比较小于0”一词的所有含义。

    【讨论】:

    • @q-l-p: ...我不知道如何更清楚。类类型默认没有定义比较运算符;必须为它们定义它们。由于这些类型是由标准库定义的,那么标准库就是定义它们的那个。
    • @q-l-p:整数比较小于零是什么意思?你的想法可能是消极的,但你从根本上思考得还不够。 “对象比较小于零”表示object &lt; 0 == true。但这也意味着object &gt; 0 == false。还有(object == 0) == false
    • 啊!您在非宾格意义上使用“比较”,与“比较不利”平行!难怪我、@q-l-p 和 Janus Bahs Jacquet 都不理解。问题是,在普通英语中,“小于零”不是像这样作为副词补语出现的东西。我同意这是一个有用的表达方式,但我不同意它是简单的英语。这是行话。
    • @ColinFine:这表明该对象在某种程度上是“负面的”。它不是。
    • @ColinFine 大多数行话都有一些简单的英语根源。整体语法结构是简单的英语。行话部分是您所说的副词的选择,以及动词“比较”的特殊含义,指的是特定计算的结果。
    【解决方案3】:

    是的,“对象比较小于 0”意味着 object &lt; 0 将产生 true。同样,compares equal to 0 表示 object == 0 将产生 true,compares greater than 0 表示 object &gt; 0 将产生 true。

    至于他为什么不使用“小于 0”这个短语,我想是为了强调这所有都是有保证的。例如,这基本上可以是任意类型,包括不真正表示实际值,而是仅支持与 0 比较的类型。

    例如,让我们考虑一个类似这样的类型:

    class comparison_result {
        enum { LT, GT, EQ } res; 
    
        friend template <class Integer>
        bool operator<(comparison_result c, Integer) { return c.res == LT; }
    
        friend template <class Integer>
        bool operator<(Integer, comparison_result c) { return c.res == GT; }
    
        // and similarly for `>` and `==`
    };
    

    [暂时,让我们假设friend template&lt;...&gt; 的东西都是合法的——我想你已经明白了基本的想法)。

    这根本不代表一个值。它只是表示“如果与0相比,结果应该小于、等于还是大于”的结果。因此,并不是它小于 0,只是它与 0 相比会产生 truefalse(但与另一个值相比会产生相同的结果)。

    至于&lt;0是否为真意味着&gt;0==0一定为假(反之亦然):对于运算符本身的返回类型没有这样的限制。该语言甚至不包括指定或强制执行此类要求的方法。规范中没有任何内容可以阻止他们全部返回true。为所有比较返回true 是可能的,而且似乎是允许的,但它可能相当牵强。

    为所有这些返回 false 是完全合理的——例如,与浮点 NaN 的任何和所有比较通常应该返回 false。 NaN 表示“不是数字”,不是数字的东西不小于、等于 大于数字。两者是无与伦比的,所以在每种情况下,答案都是(非常正确的)错误的。

    【讨论】:

    • 我已经编辑了我的问题,希望它更清晰。请您在回答中解决其他问题吗?
    • @JerryCoffin: "关于 0 和 ==0 必须为假(反之亦然):对于返回类型没有这样的限制运营商本身。”这不是真的。 P0768 和 P0515 在实际的标准措辞中非常清楚地表明,对于任何类型的值,哪些条件为真,哪些为假。例如,partial_ordering::less 将有 &gt;0false。 “比较
    【解决方案4】:

    acompares less than zero”表示a &lt; 0为真。

    a比较== 0意味着a == 0为真。

    其他的表达我现在肯定是有意义的吧?

    【讨论】:

      【解决方案5】:

      我认为到目前为止的其他答案主要回答了操作的结果是什么,现在应该很清楚了。 @VTT 的回答最能说明问题,IMO。

      但是,到目前为止,还没有人回答它背后的英语。 “对象比较小于零。”根本不是标准的英语,充其量是行话或俚语。这让非母语人士更加困惑。

      等价物是:
      使用

      这很长,所以我可以理解为什么要创建“快捷方式”:
      对象比较小于零。

      【讨论】:

      • 您是在尝试回答问题还是只是在发表评论?
      • 我正在回答。由于您尚未接受@VTT 的答案(它最好地解释了代码中发生的事情),我假设您正在寻找英语解释。所以......你去吧。
      【解决方案6】:

      表示表达式将返回一个可以与0或==0进行比较的对象。

      如果 a 和 b 是整数,则如果 a 小于 b,则表达式的计算结果为负值(可能为 -1)。

      如果 a==b,则表达式的计算结果为 0

      如果 a 大于 b,则表达式将计算为正值(可能为 1)。

      【讨论】:

      • “我认为这意味着......”是发布答案的一个相当糟糕的基础。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-20
      • 2020-01-07
      • 2018-09-10
      • 1970-01-01
      • 2012-01-27
      • 2017-05-09
      相关资源
      最近更新 更多