вы можете читать и писать отдельно, как и другие. Но если вы хотите записать в одно и то же, вы можете попробовать:
#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;
}
}
Да. NULL оценивает ко лжи, так как C считает любое ненулевое значение верными и любую ложь нулевого значения. ПУСТОЙ УКАЗАТЕЛЬ по существу эти zero
адрес и рассматривается как таковой в сравнениях, и я верю, был бы продвинут на интервал для булевой проверки. Я ожидал бы, что Ваш код читаем любому знакомому с C, хотя я, вероятно, осуществил бы явную проверку.
В C и программировании на C++, два нулевых указателя, как гарантируют, выдержат сравнение равный; ANSI C гарантирует, что любой нулевой указатель будет равен 0 в сравнении с целым типом; кроме того, макро-ПУСТОЙ УКАЗАТЕЛЬ определяется как постоянный нулевой указатель, который является значением 0 (или как целый тип или преобразованный в указатель на пустоту), таким образом, нулевой указатель выдержит сравнение равный ПУСТОМУ УКАЗАТЕЛЮ.
Касательно: http://en.wikipedia.org/wiki/Null_pointer#Null_pointer
Никогда не безопасно принять что-либо.
явная проверка также больше соглашается с тем, что Вы тестируете.
Даты языка 'C' с эры, где (пусто*) 0 мог на самом деле быть допустимый указатель. Не то, чтобы давно, 8080 и микропроцессоры Z80 имели вектор прерывания в адресе 0. Сталкивающийся с такими возможностями выбора архитектуры, это не могло сделать, почти позволяют заголовочному файлу объявить значение ПУСТОГО УКАЗАТЕЛЯ. Были некоторые компиляторы там, теперь давно забыты, где ПУСТОЙ УКАЗАТЕЛЬ не был равен (пусто*) 0 (0xffff, была следующая альтернатива), таким образом давая Ваш, если () оператор неопределенное поведение.
C++ милостиво положил конец этому, нулевой указатель является присваиваемым от и тестируемым против 0.
Да (по крайней мере, для любых стандартов совместимый компилятор C!)
От comp.lang.c FAQ:
Q: сокращенное сравнение указателя ''если (p)'' для тестирования на допустимых ненулевых указателей? Что, если внутреннее представление для нулевых указателей является ненулевым?
А: Это всегда допустимо.
ПУСТОЙ УКАЗАТЕЛЬ является просто определением препроцессора. Это находится в 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");
}
Этот код распечатает "ПУСТОЙ УКАЗАТЕЛЬ, верно". Попробуйте его, если Вы не верите мне. Ваш компилятор даже не мог бы предупредить Вас, что Вы делаете что-то странное.
Я просто отсылаю Вас к Вопрос 5.3 из C-FAQ. Это отвечает на этот точный вопрос.
NULL
определяется как постоянный указатель, который, как гарантируют, укажет на место useless/non-existent в памяти. Большинство реализаций NULL
((void *)0)
, но это не обязательно, который это так.
Да, главным образом.
Прежде всего, ПУСТОЙ УКАЗАТЕЛЬ является определением типа. Я мог по-царски завинтить Вас путем высказывания в ранее включенном заголовке
#define NULL 1
, Это не могло бы иметь много смысла, но с тех пор когда код других людей когда-либо имел смысл?:)
кроме того, в то время как это, вероятно, синтаксически безопасно, это не семантически корректно. ПУСТОЙ УКАЗАТЕЛЬ не означает "ничего", никакого TRUE или FALSE или булева значения или интервала или строки. Это означает "символ ни для чего". Так тестирование на ПУСТОЙ УКАЗАТЕЛЬ больше похоже на проблему philisophical: Если дерево падает в лесу, и if(listener)
, это делает звук?
Делают всем одолжение и соглашаться с тестированием против ПУСТОГО УКАЗАТЕЛЯ.
*NULL всегда предназначается к 0x00L. Можно полагать, что ложь, но быть уверенным всегда делают явную проверку.
В моей копии 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
, нулевой указатель. Да, 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
нулевой указатель или нет.