LINUX.ORG.RU

Ответ на: комментарий от LongLiveUbuntu

но все же NULL - это всегда (void*) 0 или что-то еще? ))

нет конечно, это от реализации зависит, вот только ты сначала осиль понятие null pointer constant + null pointer, правильно тебе сказали - RTFM

anonymous
()
Ответ на: комментарий от LongLiveUbuntu

Можешь считать что всегда 0 потому что это всегда будет работать, даже если NULL окажется не нулевым адресом.

true_admin ★★★★★
()
Ответ на: комментарий от LongLiveUbuntu

Так, по крайней мере, написано в стандарте C99. В том топике я приводил цитату, NULL как раз касающуюся.

В C++ лучше использовать 0 (или nullptr для C++0x).

schizoid ★★★
()
Ответ на: комментарий от LongLiveUbuntu

Анонимус в соседней теме утверждает, что NULL - это всегда 0

этот анонимус - я, вот только я писал, что NULL == (void*) 0, а не определен как (void*) 0, разницу видишь?

anonymous
()
Ответ на: комментарий от LongLiveUbuntu

По стандарту, NULL — это неизвестно что, как в принципе и любой другой указатель, но (void* )0 всегда выдаст этот самый NULL.

А вот (int)((char *)0) — уже не факт, что 0.

Yareg ★★★
()
Ответ на: комментарий от anonymous

:)

#ifndef _LINUX_STDDEF_H
#define _LINUX_STDDEF_H



#undef NULL
#if defined(__cplusplus)
#define NULL 0
#else
#define NULL ((void *)0)
#endif


#endif

Хотя это, конечно, не обобщает.

schizoid ★★★
()

Хотя в том топике все разжевано на 1 странице все

Boy_from_Jungle ★★★★
()
Ответ на: комментарий от LongLiveUbuntu

Но компилятор может стандарт не соблюдать...

Yareg ★★★
()
Ответ на: комментарий от anonymous

этот анонимус - я, вот только я писал, что NULL == (void*) 0, а не определен как (void*) 0, разницу видишь?

Тут есть путаница между NULL, который '#define NULL ((void *)0)' и называется null pointer constant, и собственно тем указателем. который будет сохранён в char *a = NULL.

Yareg ★★★
()
Ответ на: комментарий от Yareg

Тут есть путаница между NULL, который '#define NULL ((void *)0)' и называется null pointer constant, и собственно тем указателем. который будет сохранён в char *a = NULL.

тогда специально для всех( поправьте если не прав ):

1. NULL - это null pointer constant ( по стандарту );
2. null pointer constant - это 0 или 0 скастованный в (void*), также по стандарту;
3. при приведении null pointer constant к указателю мы получим null pointer, вот который уже может не быть 0.

теперь по оригинальному вопросу: и 0 и NULL - null pointer constant, а значит запись if( p ) ничем не отличается от if( p != NULL ), т.к. в стандарте же написано, что в if выражение сравнивается с 0.

anonymous
()
Ответ на: комментарий от LongLiveUbuntu

Анонимус в соседней теме утверждает, что NULL - это всегда 0, поэтому-де можно писать if(NULL) или if(!NULL).

дело в том, что по стандарту NULL ложно, а !NULL истинно. Что вообще говоря не обобщает, типа «NULL == 0». NULL как и любой указатель не обращается в целые числа - результат этой операции не определён. Тем не менее, к указателям можно применять сложение с целым числом. Это определено, но только если мы не выйдем за границы выделенной памяти. Ну а NULL это на самом деле такой указатель, который по определению никуда не указывает.

drBatty ★★
()

NULL это макрос. Его можно переопределить как угодно )

Harald ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

если не секрет, на фейхоа искать приключения на Ж, делая такие явно неоднозначные конструкции??? :)

+1

yoghurt ★★★★★
()
Ответ на: комментарий от yoghurt

Ломается на всяких #define TRUE FALSE

Ну, это уже ССЗБ называется :)

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от yoghurt

if(variable) хороша для флагов и именно выразительна.
классика жанра: while(!eof()) {} и читается прямо дословно «пока не конец файла»

а с поинтерами другая картина...

invy ★★★★★
()
Ответ на: комментарий от drBatty

а что же это, ели оно определено как (void*)0 ?

я выше уже все написал

anonymous
()
Ответ на: комментарий от LongLiveUbuntu

Мопед не мой. Я лично выступаю против if(NULL), но меня убеждают в том, что это-де «выразительней».

Конечно дело вкуса и стиля, но ИМХО это никак не выразительнее. Хотя конечно возможны варианты, если по смыслу алгоритма NULL значит «нет», то почему-бы это не использовать? К пример у в самом простом списке указатель next указывает на следующий, и на NULL, если это последний. Разве не логично писать if(list->next), и понимать это как «если в списке есть следующий эл-т»?

drBatty ★★
()
Ответ на: комментарий от yoghurt

Я тоже. Как и против if (variable) в целом

ИМХО это только улучшает читабельность (если конечно без фанатизма)

drBatty ★★
()
Ответ на: комментарий от drBatty

Пример.

#define ARR_SIZE  100

struct abc{
    int         i;
    struct abc  r;
    struct abc  l;
};

struct def{
    int         a1;
    int         a2;
    struct abc  arr_abc[ARR_SIZE];
}

struct def
*init_def()
{
    struct def   *def;
    int          k;

    def = (struct def*)malloc(sizeof(struct def));
    if(def == NULL) return(NULL);

    memset(def, 0, sizeof(struct def));
    for(k=0; k < ARR_SIZE; k++){
        def->arr_abc[k].r = NULL;
        def->arr_abc[k].l = NULL;
    }
    return(def);
}

Два вопроса:
1.
if(def == NULL) return(NULL);
правильное ли это сравнение в том смысле, что сравниваются разные типы?
Или надо так
if(def == (struct def*)NULL) return(NULL);

2.
Избыточен ли цикл for(), т. к. NULL != 0 ?

oleg_2
()
Ответ на: комментарий от oleg_2

Я ошибся. Должно так:

struct abc{
    int         i;
    struct abc  *r;
    struct abc  *l;
};
oleg_2
()
Ответ на: комментарий от oleg_2

во первых у тебя не указатели. Если ты хотел написать

struct abc{
    int         i;
    struct abc  *r;
    struct abc  *l;
};
то (но торопливость не хорошее свойство для с программиста)

if(def == NULL) return(NULL);

Да корректное, но лучше if (!def) .

Избыточен ли цикл for(), т. к. NULL != 0 ?

Избыточен.

Все остальное спор о кол-ве ангелов на конце игры.

Общее, старайся, чтоб точка выхода из метода, была одна. много нервов сбережешь.

def = (struct def*)malloc(sizeof(struct def));
if (def)
    memset(def, 0, sizeof(struct def));
    
return(def);

vtVitus ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.