C: NULL > NULL всегда ложно?

Гарантируется ли стандартом C, что, учитывая type_t* x = NULL; type_t* y = NULL;, мы всегда имеем x > y оценку как ложную? Я спрашиваю, потому что возможен разговор в начальном или конечном буфере malloc? из чего кажется, что следует быть осторожным со сравнением указателей и сравнивать только тогда, когда имеешь дело с указателями на элементы одного и того же массива, грубо говоря. Однако удобно иметь гарантированную оценку x > y как false, потому что мне нужна структура, которая представляет собой стековой массив, имеющий поля для первого и послепоследнего элементов, и если этот массив все еще имеет элементы 0, удобно установить эти поля должны быть NULL, и удобно по-прежнему разрешать for цикл по элементам массива, не проверяя явно, есть ли в массиве 0 элементы или больше, поэтому такое сравнение удобно...

Вам следует подумать, действительно ли вы хотите спросить, гарантированно ли NULL > NULL как выражение оценивается как false, или вы хотите спросить, гарантированно ли X > Y где оба X и Y являются значениями нулевого указателя (одного и того же типа) оцениваются как false. Это совсем другие вопросы. (В частности, NULL вообще не является значением нулевого указателя, а является константой нулевого указателя.)

user17732522 08.10.2023 08:37

@user17732522 user17732522 да, извини, я имею в виду последнее, отредактировано соответствующим образом...

Sasha 08.10.2023 11:07
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
2
103
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Удивительно, но в C это вызывает неопределенное поведение. Только == и != могут работать с нулевыми указателями. Обходной путь — привести указатели к uintptr_t и сравнить результаты.

C17 6.5.8 Операторы отношения /5

При сравнении двух указателей результат зависит от относительных расположений в адресном пространстве. объектов, на которые указывает. Если два указателя на типы объектов указывают на один и тот же объект или оба указывают один за последним элементом одного и того же объекта массива, они сравниваются равными. Если предметы указывали на являются членами одного и того же агрегатного объекта, указатели на члены структуры, объявленные позже, сравниваются больше, чем указатели на члены, объявленные ранее в структуре, и указатели на элементы массива с большими значениями индексов сравнивайте больше указателей с элементами того же массива с меньшими значениями. значения индексов. Все указатели на члены одного и того же объекта объединения сравниваются равными. Если выражение P указывает на элемент объекта массива, а выражение Q указывает на последний элемент того же объекта. объект массива, выражение указателя Q+1 сравнивается больше, чем P. Во всех остальных случаях поведение неопределенный.

(bold mine)

В этом отличие от C++, где есть пункт, в котором явно говорится, что <,<=,>,>= согласуются с ==,!=:

[выражение#rel]/5

Если два операнда p и q сравниваются равными ([expr.eq]), p<=q и p>=q оба дают true, а p<q и p>q оба дают false. ...

Однако то, является ли NULL типом указателя, определяется реализацией. Оно может быть цельным и тогда false гарантировано. И в C++, а также, предположительно, в C23, он также может не скомпилироваться, если NULL имеет тип nullptr_t.

user17732522 08.10.2023 08:30

@user17732522 Ммм, но никто не будет сравнивать NULL напрямую. OP, скорее всего, означает, что у них есть переменные-указатели, которым они присваивают NULL.

HolyBlackCat 08.10.2023 08:34

Да, вопрос, к сожалению, неточен в том, что он хочет спросить.

user17732522 08.10.2023 08:36

@user17732522 user17732522 не определен, а реализация не определена.

0___________ 08.10.2023 08:56

@HolyBlackCat да, извините, я соответствующим образом отредактировал вопрос, я имею в виду переменные, которым назначены NULL.

Sasha 08.10.2023 11:09

@0___________ Нет, определение реализации означает, что реализация должна сделать выбор и задокументировать его (и существует только ограниченный набор допустимых вариантов выбора). Согласно этому ответу, поведение прямого сравнения NULL > NULL будет неопределенным только в том случае, если реализация сделает определённый реализацией выбор использования (void*)0 (или аналогичного) в качестве определения NULL.

user17732522 08.10.2023 12:10

@0___________ Я не уверен, что стандарт C говорит об отношении неопределенного поведения и поведения, определяемого реализацией, но, по крайней мере, в стандарте C++ поведение, определяемое реализацией, четко указано как параметризация набора абстрактных машин, тогда как неопределенное поведение свойство конкретных экземпляров параметризации этой абстрактной машины (с заданными входными данными).

user17732522 08.10.2023 12:11

@user17732522 user17732522 Как C++ связан с этим вопросом?

0___________ 08.10.2023 21:48

@ 0___________ Это не так, за исключением того, что в этом ответе об этом упоминается, и я более знаком с ним.

user17732522 08.10.2023 22:17

Другие вопросы по теме