C语言中bool类型与if/else if语句的代码审查疑问
密码检查器代码疑问解答
代码实现
#include <cs50.h> #include <stdio.h> #include <ctype.h> bool valid(string password); int main(void) { string password = get_string("Enter your password: "); if (valid(password)) { printf("Your password is valid!\n"); } else { printf("Your password needs at least one uppercase letter, lowercase letter, number and symbol\n"); } } bool valid(string password) { bool haslower = false; bool hasupper = false; bool hasdigit = false; bool haspunct = false; int i; for (i = 0; password[i] != '\0'; i++) { if (isupper(password[i])) { hasupper = true; } else if (islower(password[i])) { haslower = true; } else if (isdigit(password[i])) { hasdigit = true; } else if (ispunct(password[i])) { haspunct = true; } } if (hasupper && haslower && hasdigit && haspunct) { return true; } return false; }
疑问解答
1. 关于bool类型:为何在条件判断中无需显式写=true?bool类型是否默认以true为判断基准?
在C语言里,条件判断的核心是检查值是否为非零。bool类型中,true被定义为1,false被定义为0。所以写if (hasupper)时,编译器会自动判断变量值是否非零——如果hasupper是true(值为1),条件成立;如果是false(值为0),条件不成立。这和if (hasupper == true)效果完全一致,只是前者更简洁。不是“默认以true为基准”,而是非零即真的规则适用于所有整数类型,bool本质也是整数类型的一种。
2. 关于if/else if结构:为何单个if搭配三个else if的结构可以正常工作?我原本以为需要使用嵌套if语句。
单个字符的类型是互斥的:一个字符不可能同时是大写字母、小写字母、数字和符号。else if的逻辑是只要前面的条件不成立,才会检查下一个,所以对每个字符来说,只会进入其中一个分支,设置对应的标志位(比如遇到大写字母就把hasupper设为true,不会再去检查后面的小写、数字等)。这种结构刚好匹配“对字符类型做互斥分类”的需求,完全不需要嵌套if——嵌套if是用来处理递进式条件(比如先判断是否是字母,再判断是大写还是小写),这里用平级的else if就足够清晰高效。
3. 关于valid函数:返回类型定义为bool的valid(string password)函数,是否会接收true或false作为输入参数?
不会。函数的参数列表(string password)明确说明,它接收的输入是string类型(CS50定义的字符串类型),也就是用户输入的密码内容。bool是这个函数的返回类型,意思是函数执行完成后,会向调用它的地方返回一个true或false值,用来表示密码是否符合要求。输入和返回是两个完全不同的概念,这里输入是字符串,返回才是布尔值。
内容的提问来源于stack exchange,提问作者hollythorn101
相关产品推荐
相关产品推荐

