LINUX.ORG.RU

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


0

0

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

if (pointer = getSomePointer()) 

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

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

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

?

Спасибо.

★★★★★

Ответ на: Вопрос по C/C++ от UVV

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

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

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

Sectoid ★★★★★ ()
Ответ на: Вопрос по C/C++ от Love5an

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

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

это 4.2

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

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

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

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

dilmah ★★★★★ ()
Ответ на: Вопрос по C/C++ от Love5an

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

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

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 ★★★★★ ()
Ответ на: Вопрос по C/C++ от anarquista

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

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

Love5an ()
Ответ на: Вопрос по C/C++ от LamerOk

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

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

Love5an ()
Ответ на: Вопрос по C/C++ от Love5an

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

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

mannaz ()
Ответ на: Вопрос по C/C++ от Love5an

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

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

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

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

LamerOk ★★★★★ ()
Ответ на: Вопрос по C/C++ от Love5an

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

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

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

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

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

gods-little-toy ★★★ ()
Ответ на: Вопрос по C/C++ от LamerOk

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

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

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

jtootf ★★★★★ ()

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

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

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

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

const86 ★★★★★ ()
Ответ на: Вопрос по C/C++ от const86

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

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

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

UVV ★★★★★ ()

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

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

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

xydo ★★ ()
Ответ на: Вопрос по C/C++ от UVV

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

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

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

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

xydo ★★ ()
Ответ на: Вопрос по C/C++ от yoghurt

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

«А вдруг первый goto не сработает».

Miguel ★★★★★ ()

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

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 ()
Ответ на: Вопрос по C/C++ от Love5an

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

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

Legioner ★★★★★ ()
Ответ на: Вопрос по C/C++ от Legioner

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

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

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

dilmah ★★★★★ ()
Ответ на: Вопрос по C/C++ от LamerOk

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

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

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

Davidov ★★★★ ()
Ответ на: Вопрос по C/C++ от Davidov

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

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

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

Love5an ()
Ответ на: Вопрос по C/C++ от Love5an

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

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

alex_custov ★★★★★ ()
Ответ на: Вопрос по C/C++ от Love5an

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

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

anarquista ★★★★★ ()
Ответ на: Вопрос по C/C++ от Love5an

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

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

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

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

Davidov ★★★★ ()
Ответ на: Вопрос по C/C++ от Davidov

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

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

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