【发布时间】:2010-03-25 21:43:42
【问题描述】:
string temp 等于调试器中的“ZERO:\t.WORD\t1”。 (我文件的第一行)
string temp = RemoveWhiteSpace(data);
int i = 0;
if ( temp.length() > 0 && isalpha(temp[0]) )
cout << "without true worked" << endl;
if ( temp.length() > 0 && isalpha(temp[0]) == true )
cout << "with true worked" << endl;
这是我检查 temp 的第一个字符是否为 a-z、A-Z 的代码。第一个 if 语句将评估为 true,第二个为 false。为什么?!?!?!即使没有“temp.length() > 0 &&”,我也试过这个,它仍然评估为假。它只是讨厌“== true”。我唯一能想到的是 isalpha() 返回 != 0 和 true == 1。然后,你可以得到 isalpha() == 2 != 1。但是,我不知道 C++ 是否是这样的......很奇怪。
顺便说一句,我不需要知道“== true”在逻辑上毫无意义。我知道。
输出是
without true worked
在 Ubuntu 9.10 上使用 GNU GCC 与 CodeBlock 一起编译(如果这很重要的话)
【问题讨论】:
-
你试过
cout << isalpha(temp[0]) << endl;吗? -
“我不知道 C++ 是不是……很奇怪”。查阅参考手册会给你一个想法。 cplusplus.com 说,“如果确实 c 是一个字母,则一个不同于零的值(即
true)”。这就是为什么您不应该使用 cplusplus.com:true在 C++ 中的含义与他们复制的 C 标准中的描述中的“真实”不同。 opengroup.org 说,“如果 c 是字母字符,isalpha() 函数应返回非零值”,这样更好。 -
另外,请注意
<cctype>或<ctype.h>中的 isalpha 函数与<locale>中的函数模板std::isalpha之间的混淆。后者返回bool,所以如果你调用它,那么你的代码就可以工作。 -
哦,还有一件事,
isalpha(temp[0])是错误的。如果你坚持,你应该写isalpha((unsigned char)(temp[0])),或者一个static_cast。由于我不清楚的原因,isalpha需要一个int参数,该参数必须是非负数(或 EOF),而char可能是编译器上的签名类型(我相信如果你在 Ubuntu 上x86)。没有多大意义,但你去吧。我想调用者在从字符串读取时进行转换比从流中读取时检查 EOF 更容易。 -
从风格的角度解决这个问题的其他问题:stackoverflow.com/questions/1535397/… 和 stackoverflow.com/questions/356217/… 我的看法是,与
true/false进行比较是不好的风格,因为它会导致像你这样的陷阱遇到了。
标签: c++