ПУСТОЙ УКАЗАТЕЛЬ всегда является ложью?

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

#include <iostream>
#include <fstream>

using namespace std;

int main() {

    double data[size of your data];

    std::ifstream input("file.txt");

    for (int i = 0; i < size of your data; i++) {
        input >> data[i];
        std::cout<< data[i]<<std::endl;
        }

}
51
задан An̲̳̳drew 20 January 2009 в 01:01
поделиться

11 ответов

Да. NULL оценивает ко лжи, так как C считает любое ненулевое значение верными и любую ложь нулевого значения. ПУСТОЙ УКАЗАТЕЛЬ по существу эти zero адрес и рассматривается как таковой в сравнениях, и я верю, был бы продвинут на интервал для булевой проверки. Я ожидал бы, что Ваш код читаем любому знакомому с C, хотя я, вероятно, осуществил бы явную проверку.

В C и программировании на C++, два нулевых указателя, как гарантируют, выдержат сравнение равный; ANSI C гарантирует, что любой нулевой указатель будет равен 0 в сравнении с целым типом; кроме того, макро-ПУСТОЙ УКАЗАТЕЛЬ определяется как постоянный нулевой указатель, который является значением 0 (или как целый тип или преобразованный в указатель на пустоту), таким образом, нулевой указатель выдержит сравнение равный ПУСТОМУ УКАЗАТЕЛЮ.

Касательно: http://en.wikipedia.org/wiki/Null_pointer#Null_pointer

52
ответ дан Eric Pigeon 7 November 2019 в 20:04
поделиться

Никогда не безопасно принять что-либо.

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

18
ответ дан akatakritos 7 November 2019 в 20:04
поделиться

Даты языка 'C' с эры, где (пусто*) 0 мог на самом деле быть допустимый указатель. Не то, чтобы давно, 8080 и микропроцессоры Z80 имели вектор прерывания в адресе 0. Сталкивающийся с такими возможностями выбора архитектуры, это не могло сделать, почти позволяют заголовочному файлу объявить значение ПУСТОГО УКАЗАТЕЛЯ. Были некоторые компиляторы там, теперь давно забыты, где ПУСТОЙ УКАЗАТЕЛЬ не был равен (пусто*) 0 (0xffff, была следующая альтернатива), таким образом давая Ваш, если () оператор неопределенное поведение.

C++ милостиво положил конец этому, нулевой указатель является присваиваемым от и тестируемым против 0.

17
ответ дан Hans Passant 7 November 2019 в 20:04
поделиться

Да (по крайней мере, для любых стандартов совместимый компилятор C!)

От comp.lang.c FAQ:

Q: сокращенное сравнение указателя ''если (p)'' для тестирования на допустимых ненулевых указателей? Что, если внутреннее представление для нулевых указателей является ненулевым?

А: Это всегда допустимо.

11
ответ дан Captain Segfault 7 November 2019 в 20:04
поделиться

ПУСТОЙ УКАЗАТЕЛЬ является просто определением препроцессора. Это находится в stdio.h. Как правило, только безумный человек переопределил бы его, но это возможно. Пример:

#include <stdio.h>
#ifdef NULL
#undef NULL
#define NULL 1
#endif

void main()
{

        if (NULL)
                printf("NULL is true\n");
        else
                printf("NULL is false\n");
}

Этот код распечатает "ПУСТОЙ УКАЗАТЕЛЬ, верно". Попробуйте его, если Вы не верите мне. Ваш компилятор даже не мог бы предупредить Вас, что Вы делаете что-то странное.

6
ответ дан bdowling 7 November 2019 в 20:04
поделиться

Я просто отсылаю Вас к Вопрос 5.3 из C-FAQ. Это отвечает на этот точный вопрос.

2
ответ дан anon 7 November 2019 в 20:04
поделиться

NULL определяется как постоянный указатель, который, как гарантируют, укажет на место useless/non-existent в памяти. Большинство реализаций NULL ((void *)0), но это не обязательно, который это так.

2
ответ дан dreamlax 7 November 2019 в 20:04
поделиться

Да, главным образом.

Прежде всего, ПУСТОЙ УКАЗАТЕЛЬ является определением типа. Я мог по-царски завинтить Вас путем высказывания в ранее включенном заголовке

#define NULL 1

, Это не могло бы иметь много смысла, но с тех пор когда код других людей когда-либо имел смысл?:)

кроме того, в то время как это, вероятно, синтаксически безопасно, это не семантически корректно. ПУСТОЙ УКАЗАТЕЛЬ не означает "ничего", никакого TRUE или FALSE или булева значения или интервала или строки. Это означает "символ ни для чего". Так тестирование на ПУСТОЙ УКАЗАТЕЛЬ больше похоже на проблему philisophical: Если дерево падает в лесу, и if(listener), это делает звук?

Делают всем одолжение и соглашаться с тестированием против ПУСТОГО УКАЗАТЕЛЯ.

0
ответ дан Matt 7 November 2019 в 20:04
поделиться

*NULL всегда предназначается к 0x00L. Можно полагать, что ложь, но быть уверенным всегда делают явную проверку.

-3
ответ дан Peter Mortensen 7 November 2019 в 20:04
поделиться

В моей копии ISO/IEC 9899:TC3 (Проект Комитета — Septermber 7, 2007) говорится:

6.3 Преобразований

1 оператор Several преобразовывает значения операнда от одного типа до другого автоматически.

6.3.2.3 Указателя

3 выражение целочисленной константы со значением 0 [...] называют постоянным нулевым указателем. Если постоянный нулевой указатель будет преобразован в тип указателя, то получающийся указатель, названный нулевым указателем, как гарантируют, выдержит сравнение неравный указателю на любой объект или функцию.

До сих пор, ptr!=0 верен (1) для каждого непустого указателя ptr, но это все еще открыто, как два нулевых указателя выдерживают сравнение.

6.5.9 Операторов равенства

5 [...], Если один операнд является указателем и другим, являются постоянным нулевым указателем, постоянный нулевой указатель преобразовывается в тип указателя.

6 Два указателя выдерживают сравнение равный, если и только если оба - нулевые указатели, оба [...]

Следовательно, ptr==0 1 (и ptr!=0 0), если и только если ptr нулевой указатель.

6.5.3.3 Унарных арифметических оператора

5 результат логического оператора отрицания! 0, если значение его операнда выдерживает сравнение неравный 0, 1, если значение его операнда выдерживает сравнение равный 0. Результат имеет интервал типа выражение! E эквивалентен (0 == E).

, Таким образом, то же содержит для !ptr.

6.8.4.1, если оператор

1 выражение управления, если оператор должен иметь скалярный тип.

2 В обеих формах, первый подоператор выполняется, если выражение выдерживает сравнение неравный 0.

Примечание, что скалярный тип арифметический тип или тип указателя (см. "6.2.5 Типа", пункт 21). Соединяя его, мы имеем:

  • if (ptr) успешно выполняется, в ‡” ptr!=0 является 1 в ‡” ptr, не нулевой указатель.
  • if (!ptr) успешно выполняется, в ‡” ptr==0 является 1 в ‡” ptr, нулевой указатель.
0
ответ дан 26 November 2019 в 17:22
поделиться

Да, if(!p) допустимо и гарантировал, что работал.

выражение целочисленной константы со значением 0 или такой бросок выражения для ввода пусто *, называют постоянным нулевым указателем. Если постоянный нулевой указатель будет преобразован в тип указателя, то получающийся указатель, названный нулевым указателем, как гарантируют, выдержит сравнение неравный указателю на любой объект или функцию.

https://port70.net / ~ nsz/c/c11/n1570.html#6.3.2.3p3

Это означает, что (void*)0 нулевой указатель. Это также означает что, если p указатель, то p==0 эквивалентно p==(void*)0.

Это также означает что, если p будет не нулевой указатель, то p==(void*)0 оценит к 0.

Пока неплохо.

Преобразование нулевого указателя к другому типу указателя приводит к нулевому указателю того типа. Любые два нулевых указателя должны выдержать сравнение равный.

http://port70.net/~nsz/c/c11/n1570.html#6.3.2.3p4

Примечание, что "Любые два нулевых указателя должны выдержать сравнение равный". Это означает что, если p будет нулевой указатель, то p==0 оценит к истинному, потому что 0 будет продвинут на [1 111], который является нулевым указателем. Это также означает, что никакой ненулевой указатель не может быть равен нулевому указателю.

Позволяют нам взглянуть на оператор отрицания.

результат логического оператора отрицания! 0, если значение его операнда выдерживает сравнение неравный 0, 1, если значение его операнда выдерживает сравнение равный 0. Результат имеет интервал типа выражение! E эквивалентен (0 == E).

http://port70.net/~nsz/c/c11/n1570.html#6.5.3.3p5

Это говорит нам, который !p совпадает с p==0 по определению, который совпадает с p==(void*)0, как упомянуто выше.

И взятие того, что все нулевые указатели равны к рассмотрению, это означает, что p==(void*)0 может только оценить к истинному, если p нулевой указатель и и только ложь, если p не нулевой указатель.

Так да, if(!p) совершенно безопасный способ проверить, ли p нулевой указатель или нет.

3
ответ дан 26 November 2019 в 17:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: