我在工作中遇到一个 C API 中的
is_equals()
函数,它为不相等的 SQL 表返回 1(假),为相等的 SQL 表返回 0(真)。我只是在对我的代码运行测试用例后才意识到这一点,一个用于正面示例,一个用于负面示例,但它们都失败了,起初这没什么意义。 API 中的代码没有错误,因为输出已正确记录在其文档中。
我的问题——是否存在这种逻辑NOTing正常的颠倒世界/平行宇宙/编码语言? 1通常不是真的吗? API的编码器是否出错?
比较函数通常在“等于”时返回
0
,因此它们也可以在“小于”时返回负数,在“大于”时返回正数。 strcmp()
和 memcmp()
像这样工作。
然而,零为假,非零为真是惯用的,因为这就是 C 流控制和逻辑布尔运算符的工作方式。因此,可能为该函数选择的返回值很好,但错误的是函数的name(它实际上应该被称为
compare()
或类似名称)。
这种颠倒的世界在流程错误返回中很常见。 shell变量
$?
报告上一个程序从shell执行的返回值,所以很容易判断一个程序是成功还是失败:
$ false ; echo $?
1
$ true ; echo $?
0
之所以选择这个,是因为存在一个程序成功的单一案例,但程序失败的原因可能有几十个——通过允许有许多不同的失败错误代码,一个程序可以确定为什么另一个程序失败而无需解析输出。
一个具体的例子是
aa-status
程序随AppArmor强制访问控制工具:
Upon exiting, aa-status will set its return value to the
following values:
0 if apparmor is enabled and policy is loaded.
1 if apparmor is not enabled/loaded.
2 if apparmor is enabled but no policy is loaded.
3 if the apparmor control files aren't available under
/sys/kernel/security/.
4 if the user running the script doesn't have enough
privileges to read the apparmor control files.
(我确定有更广泛传播的程序具有这种行为,但我很了解这个。:)
我怀疑它只是遵循 Linux / Unix 标准 成功返回 0.
真的说“1”是假的,“0”是真的吗?
没有充分的理由让
1
为真而0
为假;这就是事情一直被记录的方式。因此,从逻辑的角度来看,您的 API 中的函数本身并没有“错误”。
就是说,通常不建议在没有充分理由的情况下反对你正在使用的任何语言或框架的习语,所以写这个函数的人可能是相当愚蠢的,假设它不仅仅是一个错误。
简单的答案
0 = false
1 = true
如果出现错误,Windows 中
GetLastError()
的返回类型为非零,否则为零。您调用的函数的返回值通常与此相反。