foo形式的函数参数(A | B | C)

时间:2014-05-01 18:20:25

标签: php c++ algorithm function

这是一个与语言无关的问题,虽然我已经使用语言标记了一些标签,这些标签与我在下面发布的代码示例相关。我对编程有些新意。在各种语言中,我发现函数的参数与我认为的按位OR运算符分开。我已经使用过这些功能,却没有准确理解参数的工作原理。

如果您不确定我在谈论什么,我会举一些例子。

来自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);

对于那些采用这样的参数的函数到底有什么处理?有人可以解释一下吗?

5 个答案:

答案 0 :(得分:4)

如果你查找那些常数是什么,你会发现它们会是这样的: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);

答案 1 :(得分:0)

a + b + c相同。这只是一个表达,有 |(按位或)运算符。

答案 2 :(得分:0)

这些是predefined constants,其值被组合以产生位字段。

您可以在PHP中使用decbin()来深入了解这些常量的工作原理。 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.
}

答案 3 :(得分:-1)

这些是旗帜。有时函数会收到多个关于如何操作的指示,例如是以二进制模式还是以只读模式打开文件等...这种模式不是互斥的 - 文件可以打开以便在文本和文本中读取二进制模式,或以文本和二进制模式写入。因此,如果需要,您需要能够同时指定两个选项。

实现此目的的一种简单方法是使用位标志。您有一个包含所有标志的整数。例如,最低有效位表示如果要以文本模式打开文件(0 - 文本,1 - 二进制),右边的第二位表示是否打开以进行读取或写入......

要实现此功能,请使用常量:

BINARY = 1
WRITE = 2

现在,如果要以二进制和写入模式打开,可以使用BINARY | WRITE - 这会产生3.

然后被调用的函数将数字分解为位:

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

答案 4 :(得分:-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。另一种方法是完全保留原始代码中的类型。