"compares less than 0" 是什么意思?

What does "compares less than 0" mean?

上下文

当我阅读 Consistent comparison 时,我注意到动词 的特殊用法来比较 :

There’s a new three-way comparison operator, <=>. The expression a <=> b returns an object that compares <0 if a < b, compares >0 if a > b, and compares ==0 if a and b are equal/equivalent.

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

It returns a value that compares less than zero on failure. Otherwise, the returned value can be used as the first argument on a later call to get.

最后一个 example,在 GitHub 上找到(强调我的):

// Perform a circular 16 bit compare.
// If the distance between the two numbers is larger than 32767,
// and the numbers are larger than 32768, subtract 65536
// Thus, 65535 compares less than 0, but greater than 65534
// This handles the 65535->0 wrap around case correctly

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

问题*


* 我在 English Language Learners and English Language & Usage.

上寻求帮助

"compares <0" 简单的英语就是 "compares less than zero".

这是常见的shorthand,我相信。

所以将这个应用到整个句子得到:

The expression a <=> b returns an object that compares less than zero if a is less than b, compares greater than zero if a is greater than b, and compares equal to zero if a and b are equal/equivalent.

真是一口。我明白为什么作者会选择使用符号。

意思是表达式将return一个可以与<0或>0或==0进行比较的对象。

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

如果 a==b

,表达式的计算结果为 0

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

What I am interested in, more exactly, is an equivalent expression of "compares <0". Does "compares <0" mean "evaluates to a negative number"?

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

P0515 for the language feature operator<=> is that it returns one of 5 possible types. Those types are defined by the library wording in P0768中的标准写法。

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

The comparison category types’ relational and equality friend functions are specified with an anonymous parameter of unspecified type. This type shall be selected by the implementation such that these parameters can accept literal 0 as a corresponding argument. [Example: nullptr_t satisfies this requirement. — end example] In this context, the behaviour of a program that supplies an argument other than a literal 0 is undefined.

因此,Herb 的文字被直接翻译成标准措辞:比较小于 0。不多也不少。不是"is a negative number";它是一种值类型,您唯一可以用它做的就是将它与零进行比较。

请务必注意 Herb 的描述性文本 "compares less than 0" 如何转换为实际的标准文本。 P0515中的标准文本明确表示1 <=> 2的结果是strong_order::less。而 P0768 中的标准文本告诉我们 strong_order::less < 0 为真。

但它也告诉我们所有其他比较都是描述性短语 "compares less than 0".

的功能等价物

例如,如果 -1 "compares less than 0",那么这也意味着它不等于零。并且它不比较大于 0。这也意味着 0 不比较小于 -1。等等。

P0768 告诉我们 strong_order::less 和文字 0 之间的关系符合单词 "compares less than 0".

的所有含义

a比较小于零”表示a < 0为真。

a比较== 0表示a == 0为真

我确定其他表达方式现在有意义了吧?

是的,"object compares less than 0" 意味着 object < 0 将产生 true。同样,compares equal to 0 意味着 object == 0 将产生 true,而 compares greater than 0 意味着 object > 0 将产生 true。

至于他为什么不用"is less than 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<...> 的东西都是合法的——我想你已经明白了基本的想法,无论如何)。

这根本不代表一个值。它只是代表 "if compared to 0, should the result be less than, equal to, or greater than" 的结果。因此,并不是说它 小于 0,只是它在与 0 比较时产生 truefalse(但与另一个值)。

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

尽管为所有这些返回 false 是完全合理的——只是,例如,与浮点 NaN 的任何和所有比较通常应该 return false。 NaN 表示 "Not a Number",不是数字的东西不小于,等于 大于数字。两者没有可比性,所以在任何情况下,答案都是(非常正确地)错误。

我想其他的答案到现在已经基本回答了运行结果是什么,现在应该很清楚了。 @VTT 的回答解释得最好,IMO。

不过,到目前为止none已经回答了它背后的英文。 "The object compares less than zero."根本就不是标准英语,充其量是行话或俚语。这让非母语人士更加困惑。

等效项是:
使用 <0(小于零)的对象比较总是 returns true.

这很长,所以我可以理解为什么要创建 "shortcut":
对象比较小于零。