2014-05-01 5 views
3

Это не зависящий от языка вопрос, хотя я помечен языками, чтобы дать некоторые теги, относящиеся к образцам кода, которые я публикую ниже. Я немного новичок в программировании. На разных языках я видел функции, которые имеют параметры, разделенные тем, что, по моему мнению, является побитовым оператором OR. Я использовал эти функции, не понимая, как работают параметры.Функциональные параметры формы foo (A | B | C)

Приведу несколько примеров, если вы не знаете, о чем я говорю.

От http://www.php.net/manual/en/function.error-reporting.php:

<?php 

// Turn off all error reporting 
error_reporting(0); 

// Report simple running errors 
error_reporting(E_ERROR | E_WARNING | E_PARSE); 

// Reporting E_NOTICE can be good too (to report uninitialized 
// variables or catch variable name misspellings ...) 
error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE); 

// Report all errors except E_NOTICE 
error_reporting(E_ALL & ~E_NOTICE); 

// Report all PHP errors (see changelog) 
error_reporting(E_ALL); 

// Report all PHP errors 
error_reporting(-1); 

// Same as error_reporting(E_ALL); 
ini_set('error_reporting', E_ALL); 

?> 

От http://www.cplusplus.com/doc/tutorial/files/:

ofstream myfile ("example.bin", ios::out | ios::app | ios::binary); 

Что такое сделка с функциями, которые имеют параметры, как это? Может кто-нибудь объяснить?

+1

это битовая маска. Каждый флаг имеет силу в два, поэтому они могут быть объединены вместе без потери информации. –

ответ

4

Если вы Lookup, что эти константы, вы увидите, что они будут так: 1, 2, 4, 8, 16 и т.д.

Так что, добавив их все вместе в основном, (что в побитовое AFAIK: «Смещение битов в PHP является арифметическим.») вы получаете новый «номер».

http://us2.php.net/manual/en/language.operators.bitwise.php

Страница руководства имеет много хорошей информации о том, как она работает.

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

var_dump(E_ERROR); 
var_dump(E_WARNING); 
var_dump(E_PARSE); 
var_dump(E_ERROR | E_WARNING | E_PARSE); 

int(1) 
int(2) 
int(4) 
int(7) 

Так что это так же, как:

error_reporting(7); 
+2

Собирался ответить, но просто добавил к этому уже хороший ответ. – AbraCadaver

-4

Я думаю

// Report simple running errors 
error_reporting(E_ERROR | E_WARNING | E_PARSE); 

эквивалентно следующему в C или

C++
// Report simple running errors 
int const error_filter = E_ERROR | E_WARNING | E_PARSE; 
error_reporting(error_filter); 

Скорее всего, символы E_ERROR, E_WARNING являются числа с одним битом, такие как, например

E_ERROR  = 00000001 
E_WARNING = 00000010 
E_PARSE  = 00000100 

Таким образом, побитовое ИЛИ из них возвращает число с битом, установленным во всех этих позити Дополнения

error_filter = E_ERROR | E_WARNING | E_PARSE = 00000111 

Одна хитрая вещь является тип error_filter, я написал int, но это не может быть педантично правильно. Можно сказать uint32_t. Другой альтернативой является оставить тип вообще, как в исходном коде.

+0

Может ли downvoters любезно указать на ошибку в ответе? Это будет помощь и обучение. – Arun

+0

Я не спустил вниз, но они, вероятно, были до редактирования. Кроме того, сравнение с c или C++, вероятно, не помогает тому, кто задает этот вопрос, и php.net показывает, что ints эти константы определяют. – AbraCadaver

+0

@AbraCadaver: Хммм, вопрос был помечен как «C++». Ответ, даже до редактирования, не является специфическим для значений этих констант, но тот факт, что он (реальный/конечный) параметр функции является поразрядным ИЛИ отдельных констант. – Arun

-1

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

Один простой способ достичь этого - бит-флаги. У вас есть одно целое число, содержащее все флаги. Наименее значащий бит говорит, например, если файл должен быть открыт в текстовом режиме (0 - текст, 1 - двоичный), второй бит справа говорит, следует ли открывать для чтения или записи и т. Д.

для реализации этого используется константа:

BINARY = 1 
WRITE = 2 

Теперь, если вы хотите открыть в обеих двоичных и писать режим, вы используете BINARY | WRITE - что приводит к 3.

Вызванная функция затем разбивает число обратно в биты:

isBinary = (flags & BINARY) != 0; 
isWriteMode = (flags % WRITE) != 0; 
0

То же, что и a + b + c. Это просто выражение, с | (побитовым или) оператором.

+0

Сравнение между добавлением и поразрядным или немного опасно для нового программиста, не объясняя разницу. «E_ERROR + E_WARNING», похоже, работает (и звучит более логично в большинстве случаев ..) - пока кто-то не попытается применить его к «E_ERROR + E_ERRORORWARNING», давая бит переноса. –

+0

@MikkoRantanen В какой момент я должен объяснить _all_ операторов C++ и их приоритет? –

+0

Или вы могли бы использовать «a-b-c» в качестве примера, если бы ваша цель заключалась в сравнении выражений. Из вашего ответа я не мог сказать, использовали ли вы «a + b + c» в качестве альтернативы «a | b | c», что было бы ужасной формой. В большинстве случаев битмаски «a + b + c» и «a | b | c» дают тот же результат - то есть до тех пор, пока два значения не будут иметь перекрывающиеся биты. –

0

Это predefined constants, значения которых объединены для создания битового поля.

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

printf("%02s", decbin(E_ERROR));    // output 01 
printf("%02s", decbin(E_WARNING));    // output 10 
printf("%02s", decbin(E_ERROR | E_WARNING)); // output 11 

(я проложенный все значения, так что OR операция ясно)

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

function func($flag) { 
    if ($flag & E_ERROR) echo "E_ERROR enabled"; 
    // etc. 
} 
Смежные вопросы