LINUX.ORG.RU

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

Хотя если явно же, то бородатые дяди рекомендуют

Ну, это да. Хотя по хорошему компилятор должен выдавать warning при присваивании в условии. Но до этого ещё не дожили, насколько я в курсе :)

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

NULL как раз не 0, а (void *)0.

Это эквивалентно численно.

Мнение C99 я тебе привел дословно выше. Там это утверждается напрямую.

Можешь использовать NULL как эквивалент false. Комитет ISO тебе разрешает персонально.

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

Но до этого ещё не дожили, насколько я в курсе :)

ты не в курсе, можешь проверить в gcc

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

В том-то и дело, что знаю. А вы, судя по всему, нет — если категорично заявляете, что NULL == 0.

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

ты совсем тупой? Задачка для детей дошкольного возраста: у Феди два яблока, у Лёши столько же. Сколько яблок у Лёши?

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

Это эквивалентно численно.

Во. Вот этого-то я и добиваюсь от одного узколобого анонимуса, у которого ещё и проблемы с логикой.

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

какую ты платформу имеешь ввиду?

Любую, где (void*) 0 — допустимый адрес. И где самопальные компиляторы могут не заморачиваться вопросами особого приведения указателя в число. От MS-DOS и PV-OS до всяких embedded.

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

И где самопальные компиляторы

Я думал речь идет о компиляторах, хотя бы отдаленно придерживающихся стандарта. Для других нет смысла переносимый код, надо разбираться с конкретным случаем.

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

Любую, где (void*) 0 — допустимый адрес

сколь же трэша в этом топике, (void*) 0 - ВЕЗДЕ недопустимый адрес, для кого тут стандарт цитировали?

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

попробуй такое сделать на LLVM 3.0

объясню на пальцах - LLVM про С вообще ничего не знает, дальше догадайся

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

Посмотрел ненадолго, что тут анонимусы пишут

(void*) 0 - ВЕЗДЕ недопустимый адрес

Таки не зря я показ анонимусов вырубил :D

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

там говорится о том, что NULL равен 0 или (void*)0 и о том, что это недопустимый адрес.

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

Таки не зря я показ анонимусов вырубил

очевидно кто-то не любит, когда его макают в его же выс комментарии, ну сколько можно:

An integer constant expression with the value 0, or such an expression cast to type void *, is called a null pointer constant. If a null pointer constant is converted to a pointer type, the resulting pointer, called a null pointer, is guaranteed to compare unequal to a pointer to any object or function.

ну прочитайте это уже, напрягите свою извилину.

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

они тупые. Пошли отсюда, мой анонимный брат.

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

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

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

C и был создан для того, чтоб писать переносимый между разными аппаратными платформами код и не привязываться к железу. Но тебе, многоуважаемый любитель ПХП с десятилетним стажем и неосилятор ни одного языка, этого как всегда не понять.

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

на x86_64 проблем нет. ЧЯДНТ? Создаётся впечатление, что количество звёздочек обратно пропорционально количеству извилин.

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

Ну попробуй какой-нибудь sdcc на 8051 или ещё что-нибудь подобное, мой разумный анонимный друг))

void* приводится к int отрезанием старших бит. Есть ли в компиляторе спец затычка для ! и указателей - вопрос.

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

Любую, где (void*) 0 — допустимый адреc

ВНЕЗАПНО с т.з. аппаратуры (void*) 0 - очень много где допустимый адрес. В т.ч. и на x86. Конечно, очень мало кто работает на таком уровне, так что их методы на**ывания компилятора простых смертных волновать не должны.

И ещё. Крон, хватит смущать молодёжь багами ископаемых компиляторов под ископаемые платформы. НЕ БУДЕТ проблем если писать if(!ptr). А замусоривать-ли код тавтологией типа f(ptr==NULL) - дело вкуса.

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

Это недопустимое значение указателя (как структуры языка).
Но это не является недопустимым адресом памяти.

а это абсолютно не имеет разницы, KRoN73 сказал, что использование (void*) 0 может вылезти боком - стандарт гарантирует обратное, все остальное его фантазии и воспоминания про раритетное железо, где в теории может найтись компилятор, который вдруг не реализует базовые пункты стандарта

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

Ну, ладно, в любом случае это их личные половые трудности :)

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

void* приводится к int отрезанием старших бит

По стандарту - нет, не так.

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

О глупый, неспособный мыслить логически анонимус.

NULL - численный эквивалент нуля в стандарте C99. Использовать его в логических и арифметических выражениях стандарт разрешает и гарантирует правильную работу.

Разыменовывать же null pointer - дело очень другое. Это на x86 (в защищённом режиме) будет вава. Другие архитектуры (и иногда x86 в реальном режиме) могут разрешать такое действие. Для таких альтернативных архитектур невалидный указатель может быть равен -1, -2, -100500, 0xdeadbeef, ... - по желанию левой пятки автора системы.

Вот что KRoN73 пытался до тебя донести, юный друг.

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

разыменовывать же null pointer - дело очень другое

Не хочу тебя обижать, но ты кретин, разыменовывать null pointer по стандарту не имеет смысла.

Вот что я пытался до тебя донести, юный друг.

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

Это если заведомо знать, что он равен нулю :)

по стандарту «null pointer is guaranteed to compare unequal to a pointer to any object or function», хотя что я говорю - вы ж с кроном пишете не по стандарту С, а под разное нетипичное железо с кривыми компиляторами под него, не гнушаясь разыменовать null pointer для своих задач, ведь явно указать адрес - это для школьников

anonymous
()

в С NULL это NULL, не обязательно ноль и не обязательно не ноль (или так: обязательно ноль или обязательно не ноль :) считай это неким значением указателя который никуда не указывает (not valid pointer).

код

if (!NULL) {
    feixua();
}
не имеет смысла ибо на одних платформах будет тру, а не других не тру. не делай так.

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

невалидный указатель может быть равен -1, -2, -100500, 0xdeadbeef, ... - по желанию левой пятки автора системы.

Вот что KRoN73 пытался до тебя донести, юный друг.

Нет. Он как раз доносил, что некоторые кривые слепленные из говна и палок компиляторы C могут, _нарушая стандарт_, выдать программисту детали реализации ( -1, -2, -100500, 0xdeadbeef). Но нормальные компиляторы так не делают и всегда и (int)NULL==0.

Повторяю для тугих: если аппаратура требует, чтобы невалидный указатель был 0xdeadbeef, то в нормальных компиляторах (int)NULL всё равно будет ==0. А в плохих, ужасных, омерзительных ктулхианских компиляторах - да, там может быть и (int)NULL==0xdeadbeef и 2*2=4.3(3) и т.д. но всем похер.

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

а я срал на тупые компиляторы и все равно буду делать if (!pointer) ибо похуй а тем кому еще не похуй предлагаю кончить задротсвовать ибо это мрак и у вас в голове какашки

anonymous
()

Стандарт гарантирует, что foo() будет выполняться всегда?



Почти.

6.3.2.3 Pointers

3 An integer constant expression with the value 0, or such an expression cast to type
void *,is called a null pointer constant.

5 An integer may be converted to any pointer type. Except as previously specified, the
result is implementation-defined, might not be correctly aligned, might not point to an
entity of the referenced type, and might be a trap representation.
56) The mapping functions for converting a pointer to an integer or an integer to a pointer are intended to be consistent with the addressing structure of the execution environment.
6 Anypointer type may be converted to an integer type. Except as previously specified, the
result is implementation-defined.

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

а я вот считаю идиотизм писать if (pointer == NULL) ибо си ценят за краткость и лаконичность а не за это уродство

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

Уроки сделайте.

не я об этом сказал хочеш поговорить об этом ?

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

Плюс, если не ошибаюсь, то !а должно означать то же, что и (а == 0). Т.о. в первом случае получается буквально

Если это так, то if(!NULL) раскроется в if(NULL != 0), и 0 приведётся к указателю, равному NULL.

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