这是我的程序的测试代码:
#include <iostream>
#include "ctype.h"
using std::cout;
int main(){
cout << "Welcome to the program: ";
cout << "\n" << "Let's see if the value of \'x\' is digital: ";
int x = 5;
cout << isdigit(x);
cout << "\n" << "Let's see if the value of \'i\' is alphabetical: ";
char i = 'i';
cout << isalpha(i);
return 0;
}
结果:
欢迎来到该计划:
让我们看看'x'的值是否为数字:0
让我们看看'i'的值是否按字母顺序排列:2
两个值都是2或0,而它们都是真的吗? 不应该只是结果中显示的0或1值? 注意:我没有在全局变量部分使用'enum'或'#define'更改值。
答案 0 :(得分:6)
isXXX()
函数将返回表示true或false值的整数。假设零是假的,而其他任何东西都是真的,那么两个是完全可接受的返回值。
您为isdigit(5)
获取错误值的原因是因为该函数采用字符并告诉您它是否为数字。虽然'5'
可能是数字字符,但5
很可能不是。
C ++遵循这些函数的C,因为它们是cctype
标题的一部分。标准的相关部分(C99 7.4
)指出:
标题
<ctype.h>
声明了几个对字符分类和映射有用的函数。在所有情况下,参数都是int
,其值应表示为无符号字符或等于宏EOF
的值。当且仅当参数
c
的值符合函数描述中的值时,本子句中的函数才返回非零(true)。
通常,在C和C ++ C-legacy函数(a)中,您永远不应该将真值与固定的真/假值进行比较。因为它将零视为假,其他一切都是真的,正确的方法就是:
cout << "It " << (isdigit(x) ? "is" : "isn't") << " a digit";
(a)这通常是一个很好的规则,即使对于 为真的C ++ bool
比较(和其他语言),假的。
如果布尔值或函数被正确命名(并且应该),那么正确的方法是:
if (! errorOccurred) ...
if (isComplete) ...
if (isdigit(myChar)) ...
那是因为,使用 reductio ad absurdum ,表达式boolVal == TRUE
只是另一个布尔值,所以你在哪里停止?
if (isComplete == TRUE) ...
if ((isComplete == TRUE) == TRUE) ...
if (((isComplete == TRUE) == TRUE) == TRUE) ...
if ((((isComplete == TRUE) == TRUE) == TRUE) == TRUE)...
依此类推, ad infinitum 。
答案 1 :(得分:2)
不,isalpha
和isdigit
不返回布尔值,也不需要返回1
。如果谓词满足,则指定它们返回非零值,否则返回零。