LINUX.ORG.RU

Вопрос по C/C++


0

0

Привет. В этом фрагменте:

if (pointer = getSomePointer()) 

проверяется:

а) истинность результата присваивания

б) само значение указателя

?

Спасибо.

★★★★★

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

>Возьму на заметку, как не надо писать.

Специально для этих целей некоторые предпочитают в сравнениях ставить константную часть слева. Тогда шанс, что компилятор об этом «закричит» существенно выше.

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

> вообще говоря, NULL это не обязательно (void*)0

это 4.2

NULL обязательно равен (void*)0

А вот если у тебя есть: int var = 0;

то тогда действительно NULL не обязательно равен (void*)var

Разница в том что в первом случае ноль константый и его правильная обработка гарантируется стандартом.

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

В Стандарте написано ясно:

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.

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

То, что написано в стандарте, к сожалению, к реальным компиляторам Си и, особенно, C++, относится весьма опосредствованно.

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

под рукой нет, но, емнип, какой-то специфический для то ли ARM, то ли Alpha, целый диапазон значений для нуллпойнтера резервировал.

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

Ты не проспал, ты ступил. Пятидюймовая дискета с компилятором C, не поддерживающим структуры - это весьма слабый повод кидаться авторитетными фразами о стандартах, не?

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

> целый диапазон значений для нуллпойнтера резервировал.

Что значит «диапазон»?

printf(«%p»,NULL) что говорит?

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

> под рукой нет, но, емнип, какой-то специфический для то ли ARM, то ли Alpha, целый диапазон значений для нуллпойнтера резервировал.

И как это выглядело? Могло быть (x == NULL ) && (y == NULL) && (x!=y) ?

NULL - это, как не крути, одно какое-то значение, а не диапазон.

И в чем резервация диапазона для NULL заключалась? Не давало разыменовывать указатели туда?

gods-little-toy ★★★
()
Ответ на: комментарий от LamerOk

printf(«%p»,NULL) что говорит?

в данном случае он должен выводить «изыди, лиспер». надо полагать, так

jtootf ★★★★★
()

> а) истинность результата присваивания

б) само значение указателя

В данном случае это одно и то же. Результат присваивания есть присвоенное значение указателя, которое и проверяется на истинность (не ноль).

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

Да, написал немного неточно. Под а) понимается истинность операции присваивания.

/off ну вы и флеймеры... ))

UVV ★★★★★
() автор топика

>истинность результата присваивания
нету такого понятия!

оператор присваивания переписывает значение в переменную и подставляет вместо себя это самое значение (точнее ссылку на переменную, в которой уже записано это новое значение)

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

>истинность операции присваивания
bool b;
b=false;

присваивание произошло, операция выполнилась успешно, значит она истинна. а результат - ЛОЖЬ.

итог: не выдумывай лишних терминов.

xydo ★★
()

GCC на такие выражения дает предупреждения. Нужно операцию присваивания заключать в дополнительные скобки.

cat test.c 
#include <stdio.h>

void *getSomePointer()
{
  return NULL;
}

int main()
{
  int *p = (void *)0;
  if( p = getSomePointer() )
  {
    printf("True\n");
  }
  else
  {
    printf("False\n");
  }
  return 0;
}
~/tmp$ gcc -Wall test.c 
test.c: In function ‘main’:
test.c:11: warning: suggest parentheses around assignment used as truth value

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

Ты не вкуриваешь. Откуда берётся NULL в природе? Есть такая константа (для С++ объявленная как 0, для С как (void *) 0 ). Ещё его возвращают НЕКОТОРЫЕ библиотечные функции в случае ошибки (malloc, realloc, что то ещё). Ещё прописано поведение некоторых функций, на передачу им NULL-а (free ничего не делает, например). Всё. Никакому диапазону тут нет никакого разумного объяснения. Если речь о том что 2 физически разных адреса логически показывают в одно и то же место (например если адрес - сегмент + смещение и сегменты могут перекрываться), то это уже проблемы компилятора, как генерировать корректный код для их сравнения.

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

> Никакому диапазону тут нет никакого разумного объяснения.

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

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

Да успокойтесь вы. У человека каша в голове: он, видимо, где-то прочитал, что побитово void *a=NULL; не равен нулю. Но понял не совсем правильно.

В то же время общеизвестно, что NULL - это и есть (void *)0. А уж куда будет при этом указывать указатель, не имеет значения.

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

Я тебе лично разрешаю трактовать NULL как 0x00000000[00000000]
Тем более, что ты все равно кроме как на x86[-64] никогда не писал и писать не будешь, скорее всего.

Но вот заниматься телепатией в моем отношении - нет.

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

ты не путай (void *)0 и побитовый 0. А ты путаешь, и ещё доказываешь что ты прав.

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

ну и каким образом в данном случае связаны язык C и архитектура процессора? вы знаете, язык C появился отнюдь не вместе с x86…

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

Безнадёжный случай, видимо.

Я лишь замечу, что (void *)0 побитово нулю не равен (хотя может быть в теории).

И до момента появления хоть какого-нибудь пруфа (а его не существует), дискуссию прекратить. Ссылочку на стандарт уже привели.

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

>Я лишь замечу, что (void *)0 побитово нулю не равен
Ты сам с собой разговариваешь?

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