警告:isupper()の戻り値は true/falseじゃない
1は非ゼロだが非ゼロが1とは限らない。
■if(isupper() == true)は間違い
#include <stdio.h>
#include <ctype.h>
#include <stdbool.h>
int main(void){
char buf[] = "abcd123EFG456hijk789";
printf("変換前 %s\n",buf);
for(char *cp = buf;*cp != '\0';cp++){
if(isupper(*cp) == true){
*cp = tolower(*cp);
continue;
}
if(islower(*cp) == true){
*cp = toupper(*cp);
continue;
}
}
printf("変換後 %s\n",buf);
}
isupperは
ゼロか非ゼロを返しますが、
非ゼロが1とは限りません。
なのでこのプログラムは期待した
大文字小文字変換を行いません。
■falseと比較すると動く(非推奨)
#include <stdio.h>
#include <ctype.h>
#include <stdbool.h>
int main(void){
char buf[] = "abcd123EFG456hijk789";
printf("変換前 %s\n",buf);
for(char *cp = buf;*cp != '\0';cp++){
if(isupper(*cp) != false){
*cp = tolower(*cp);
continue;
}
if(islower(*cp) != false){
*cp = toupper(*cp);
continue;
}
}
printf("変換後 %s\n",buf);
}
このプログラムは期待した
大文字小文字変換を行います。
しかし、
if(isupper(*cp) != false)を
日本語で読み上げると
「もし*cpが大文字であるならばが偽でなければ」のようになり読みにくいです。
■明示的な検査をしない(推奨)
#include <stdio.h>
#include <ctype.h>
#include <stdbool.h>
int main(void){
char buf[] = "abcd123EFG456hijk789";
printf("変換前 %s\n",buf);
for(char *cp = buf;*cp != '\0';cp++){
if(isupper(*cp)){
*cp = tolower(*cp);
continue;
}
if(islower(*cp)){
*cp = toupper(*cp);
continue;
}
}
printf("変換後 %s\n",buf);
}
このプログラムは期待した
大文字小文字変換を行います。
if(isupper(*cp) )を
日本語で読み上げると
「もし*cpが大文字ならば」のようになり
読みやすいです。
参考:
EXP20-C. 成功、真偽、等価を判定するには明示的な検査を行う
C-FAQ9.2一般にTRUEやFALSEを相手に明示的にテストするこ とは望ましくない。