Пока я читал* Последовательное сравнение, Я заметил странное использование глагола сравнивать:
Есть новый трехсторонний оператор сравнения, <=>. Выражение <=> б
возвращает объект, который сравнивает <0 если < б, сравнивает > 0 если а> б, а также
сравнивает == 0 если а также б равны / эквивалентны.
Другой пример, найденный где-то в интернете (выделено мной):
Возвращает значение, которое сравнивает меньше нуля на провал. Иначе,
возвращаемое значение может быть использовано в качестве первого аргумента при последующем вызове
получить.
Последний пример, найденный в исходный код на GitHub (акцент мой):
// Выполнить круговое 16-битное сравнение.
// Если расстояние между двумя числами больше 32767,
// и числа больше 32768, вычитаем 65536
// Таким образом, 65535 сравнивает меньше 0, но больше 65534
// Это правильно обрабатывает 65535-> 0
Конечно, для опытных программистов смысл этих выражений понятен. Но использование глагола сравнивать не соответствует синтаксическим правилам грамматики английского языка. Это жаргон.
0
с использованием<
оператор результат даст true? Есть ли другие последствия? Если объект сравнивается<0
Означает ли это (object == 0)
даст ложное и (object > 0)
даст ложь?LHS
operand
сравнивает comparison operator
RHS
operand
* Английский для меня иностранный язык.
** Я задавал похожие вопросы на Изучающие английский язык и на Английский язык & использование.
Да, «объект сравнивает меньше 0» означает, что object < 0
даст true
, Точно так же, compares equal to 0
средства object == 0
даст истину, и compares greater than 0
средства object > 0
даст истину.
Что касается того, почему он не использует фразу «меньше 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<...>
все законно — я думаю, вы понимаете основную идею, в любом случае).
Это на самом деле не представляет ценности вообще. Он просто представляет результат «по сравнению с 0, если результат будет меньше, равен или больше чем». Как таковой, это не то, что это является меньше 0, только то что выдает true
или же false
по сравнению с 0 (но дает те же результаты по сравнению с другим значением).
Относительно того <0
быть истинным означает, что >0
а также ==0
должно быть ложным (и наоборот): нет такого ограничения на тип возвращаемого значения для самого оператора. Язык даже не включает в себя способ указать или обеспечить выполнение такого требования. В спецификации нет ничего, что могло бы помешать их возвращению true
, возврате true
для всех сравнений возможно и кажется разрешенным, но это, вероятно, довольно надумано.
возврате false
хотя все они вполне разумны — просто, например, любые и все сравнения с NaN с плавающей запятой обычно должны возвращаться false
, NaN означает «не число», а то, что не является числом, не меньше, равно или же больше, чем число. Эти два несопоставимы, поэтому в каждом случае ответ (совершенно справедливо) ложный.
«сравнивает <0 «в простом английском это» сравнивает меньше нуля «.
Я считаю, что это обычная запись.
Таким образом, применение этого ко всему предложению дает:
Выражение а <=> b возвращает объект, который сравнивается меньше нуля
если a меньше b, сравнивается больше нуля, если a больше чем
b, и сравнивается равным нулю, если a и b равны / эквивалентны.
Что довольно глоток. Я понимаю, почему авторы решили использовать символы.
То, что меня интересует, точнее, эквивалентное выражение «сравнивает <0 «. Делает» сравнивает <0 «среднее» оценивает как отрицательное число »?
Во-первых, нам нужно понять разницу между тем, что вы цитировали, и фактической формулировкой стандарта. То, что вы цитировали, было просто объяснением того, что на самом деле будет включено в стандарт.
Стандартная формулировка в P0515 для языковой функции operator<=>
является то, что он возвращает один из 5 возможных типов. Эти типы определяются библиотека формулировка в P0768.
Эти типы не являются целыми числами. Или даже перечисления. Они есть типы классов. Это означает, что они имеют в точности и только те операции, которые для них определяет библиотека. И формулировка библиотеки очень специфична о них:
Реляционные типы сравнения и функции дружественного равенства задаются анонимным параметром неопределенные тип. Этот тип должен быть выбран реализацией так, чтобы эти параметры могли принимать литералы
0
в качестве соответствующего аргумента. [Пример:nullptr_t
удовлетворяет этому требованию. —
end example] В этом контексте поведение программы, которая предоставляет аргумент, отличный от литерала0
не определено
Поэтому текст Херба переводится прямо в стандартную формулировку: сравнивает меньше 0. Не больше, не меньше. Не «отрицательное число»; это тип значения, где единственное, что вы можете с ним сделать, это сравнить его с нулем.
Важно отметить, что описательный текст Херба «сравнивает меньше 0» переводится в фактический стандартный текст. Стандартный текст в P0515 проясняет, что результат 1 <=> 2
является strong_order::less
, И стандартный текст в P0768 говорит нам, что strong_order::less < 0
правда.
Но это также говорит нам, что все другие сравнения являются функциональным эквивалентом описательной фразы «сравнивает меньше 0».
Например, если -1 «сравнивает меньше 0», то это также подразумевает, что он не сравнивается равным нулю. И то, что он не сравнивает больше 0. Это также означает, что 0 не сравнивает меньше чем -1. И так далее.
P0768 говорит нам, что отношения между strong_order::less
и буквальный 0
подходит всем значениям слова «сравнивает меньше 0».
«a
сравнивает меньше нуля «означает, что a < 0
правда.
«a
сравнивает == 0
Значит это a == 0
правда.
Другие выражения, которые, я уверен, теперь имеют смысл, верно?
Я думаю, что другие ответы до сих пор отвечали, главным образом, каков результат операции, и это уже должно быть ясно. @ Ответ VTT объясняет это лучше всего, IMO.
Тем не менее, до сих пор никто не ответил на английском языке за этим.
«Объект сравнивается меньше нуля». это просто не стандартный английский, в лучшем случае это жаргон или сленг. Что делает его еще более запутанным для не носителей языка.
Эквивалент будет:
Сравнение объекта с использованием <0 (меньше нуля) всегда возвращает истину.
Это довольно долго, поэтому я могу понять, почему был создан «ярлык»:
Объект сравнивает меньше нуля.
Это означает, что выражение вернет объект, который можно сравнить с <0 или> 0 или == 0.
Если a и b являются целыми числами, то выражение оценивается как отрицательное значение (вероятно, -1), если a меньше, чем b.
Выражение оценивается в 0, если a == b
И выражение будет иметь положительное значение (вероятно, 1), если a больше, чем b.