Объяснение позади возврата 0 как значение по умолчанию в C/C++

В Python определение пакета очень просто. Подобно Java, иерархическая структура и структура каталогов одинаковы. Но вы должны иметь __init__.py в пакете. Я объясню файл __init__.py следующим примером:

package_x/
|--  __init__.py
|--    subPackage_a/
|------  __init__.py
|------  module_m1.py
|--    subPackage_b/
|------  __init__.py
|------  module_n1.py
|------  module_n2.py
|------  module_n3.py

__init__.py может быть пустым, если он существует. Он указывает, что каталог следует рассматривать как пакет. Конечно, __init__.py также может установить соответствующий контент.

Если мы добавим функцию в module_n1:

def function_X():
    print "function_X in module_n1"
    return

После запуска:

>>>from package_x.subPackage_b.module_n1 import function_X
>>>function_X()

function_X in module_n1 

Затем мы выполнили пакет иерархии и вызвали функцию module_n1. Мы можем использовать __init__.py в subPackage_b следующим образом:

__all__ = ['module_n2', 'module_n3']

После запуска:

>>>from package_x.subPackage_b import * 
>>>module_n1.function_X()

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named module_n1

Следовательно, используя * import, пакет модулей подчиняется __init__.py контенту.

15
задан Marcelo MD 1 December 2008 в 03:27
поделиться

12 ответов

Объяснение - то, что Вы хотите отличить набор всех возможных (отрицательных) возвращаемых значений, соответствующих различным ошибкам от единственная ситуация, в которой все пошли хорошо. Самое простое, самое краткое и большая часть C-выхода, способом преследовать такое различие является логический тест, и с тех пор в C все целые числа, "верны" за исключением нуля, Вы хотите возвратить нуль для значения "единственной ситуации", т.е. Вы хотите нуль как "хорошее" значение.

та же цепь рассуждений относится к возвращаемым значениям программ Unix, но действительно в тестах в рамках сценариев оболочки Unix логика инвертируется: возвращаемое значение 0 означает "верный" (например, посмотрите на возвращаемое значение/bin/true).

24
ответ дан 1 December 2019 в 00:07
поделиться

Первоначально, C не имел "пусто". Если функция ничего не возвратила, Вы просто оставили тип возврата в пробеле объявления. Но это означало, что это возвратило интервал

Так, все возвратило что-то, даже если это ничего не означало. И, если Вы конкретно не обеспечили возвращаемое значение, независимо от того, что значение, оказалось, было в регистре, который раньше возвращал значения компилятор, стал возвращаемым значением функции.

// Perfectly good K&R C code.
NoReturn()
{
   // do stuff;
   return;
}

int unknownValue = NoReturn();

Люди взяли к очистке этого для обнуления для предотвращения проблем.

19
ответ дан 1 December 2019 в 00:07
поделиться

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

могло также просто случиться так, что они не возвращают ничего, которое интерпретируется как 0. (По существу то же понятие.)

4
ответ дан 1 December 2019 в 00:07
поделиться

Другая (незначительная) причина имеет отношение к скорости машины уровня и размеру кода.

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

, Другими словами, если последняя эксплуатация машины (например, НАЖАТИЕ) заставила нас обнулять, все, которое нам нужно, вскакивать-нуль или jump-not-zero.

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

4
ответ дан 1 December 2019 в 00:07
поделиться

Поскольку Bash и большинство других сред оболочки UNIX рассматривают 0 как успех и-x как системная ошибка и x как пользовательская ошибка.

2
ответ дан 1 December 2019 в 00:07
поделиться

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

1
ответ дан 1 December 2019 в 00:07
поделиться

Я могу быть неправ относительно этого, но я думаю, что это главным образом по историческим причинам (истеричный изюм?). Я верю этому K& R C (предварительный ANSI) не имел пустого типа, таким образом, логический способ записать функцию, которая не возвратила ничего интересного, состоял в том, чтобы иметь его, возвращаются 0.

, Конечно, кто-то здесь исправит меня, если я буду неправ... :)

1
ответ дан 1 December 2019 в 00:07
поделиться

Мое понимание - то, что это было связано с поведением системных вызовов.

Рассматривают open() системный вызов; если это успешно, это возвращает неотрицательное целое число, которое является дескриптором файла, который был создан. Однако вниз на ассемблерном уровне (где существует специальное предложение, non-C инструкция, что прерывания в ядро), когда ошибка возвращается, она возвращается как отрицательная величина. Когда это обнаруживает ошибочный возврат, обертка кода C вокруг системного вызова хранит отрицаемое значение в errno (таким образом errno имеет положительное значение), и функция возвращается-1.

Для некоторых других системных вызовов, отрицательный код возврата на ассемблерном уровне все еще отрицается и помещается в errno, и-1 возвращается. Однако эти системные вызовы не имеют никакого специального значения для возврата, таким образом, нуль был выбран для указания на успех. Очевидно, существует большое множество системных вызовов, но большинству удается соответствовать этим конвенциям. Например, stat() и его родственники возвращают структуру, но указатель на ту структуру передается как входной параметр, и возвращаемое значение является 0 или-1 состоянием. Даже signal() управляет им;-1 был SIG_DFL, и 0 был SIG_IGN, и другие значения были указателями функции. Существует несколько системных вызовов без ошибочного возврата - getpid(), getuid() и так далее.

Этот zero-indicates-success механизм был затем эмулирован другими функциями, которые не были на самом деле системными вызовами.

1
ответ дан 1 December 2019 в 00:07
поделиться

Традиционно, код возврата 0 указывает, что Ваша программа обычно заканчивалась, и все хорошо. (Можно помнить это как "нулевые ошибки", хотя для технических причин, Вы не можете использовать количество ошибок Ваша программа, найденная как код возврата. Посмотрите Стиль.) Код возврата кроме 0 указывает, что своего рода ошибка произошла. Если Ваш код завершается, когда он встречается с ошибкой, используйте выход и укажите ненулевой код возврата. Источник

1
ответ дан 1 December 2019 в 00:07
поделиться

Поскольку 0 ложь и пустой указатель в C/C++, и можно сделать удобные короткие пути, когда это происходит.

0
ответ дан 1 December 2019 в 00:07
поделиться

Это - потому что при использовании от UNIX окружают команду, которая возвращается 0, указывает на успех.

Любое другое значение указывает на отказ. Поскольку Paul Betts указывает на положительные и отрицательные величины delimitate, где ошибка, вероятно, произошла, но это - только конвенция и не абсолют. Пользовательское приложение может возвратить отрицательное значение без любого плохого последствия (кроме него, указывает к оболочке, что приложение перестало работать).

0
ответ дан 1 December 2019 в 00:07
поделиться

Помимо всех тонкостей, сделанных предыдущими плакатами, это также очищает код значительно, когда функция возвращается 0 на успехе.

Рассмотрите:

if ( somefunc() ) {
   // handle error
}

является намного более чистым, чем:

if ( !somefunc() ) {
   // handle error
}

или:

if ( somefunc() == somevalue ) {
   // handle error 
}
0
ответ дан 1 December 2019 в 00:07
поделиться