卫语句优化多层if else嵌套

news2025/3/16 6:42:37

一、卫语句的介绍

卫语句是一种编程实践,用于在函数或方法的开头快速处理不符合条件的情况,从而避免深层次的嵌套结构。它的核心思想是尽早返回,减少嵌套,使代码更加清晰易读。

二、卫语句的作用

  1. 提高可读性:卫语句将不符合条件的情况逐一提前处理,使得正常流程的代码位于函数的末尾,逻辑更加直观。

  2. 减少嵌套:传统的多重if-else结构会导致深层次的嵌套,而卫语句通过提前返回,避免了嵌套,使得代码更加简洁。

  3. 易于维护:卫语句使得代码的逻辑更加直观,便于后续的维护和修改。

三、卫语句的示例代码

优化前的代码(多重if-else结构)

#include <stdio.h>
#include <string.h>

// 定义用户名和密码的最大长度
#define MAX_USERNAME_LEN 20
#define MAX_PASSWORD_LEN 20

/**
 * 传统的多重if-else结构的登录验证函数
 * 
 * @param username 用户名
 * @param password 密码
 * @return 返回1表示登录成功,0表示登录失败
 */
int login(const char *username, const char *password) {
    // 首先检查用户名和密码是否都不为空
    if (username != NULL && password != NULL) {
        // 检查用户名和密码长度是否在允许范围内
        if (strlen(username) <= MAX_USERNAME_LEN && strlen(password) <= MAX_PASSWORD_LEN) {
            // 检查用户名和密码是否匹配
            if (strcmp(username, "admin") == 0 && strcmp(password, "123456") == 0) {
                // 如果所有条件都满足,登录成功
                printf("登录成功!\n");
                return 1;
            } else {
                // 如果用户名或密码不匹配,登录失败
                printf("用户名或密码错误!\n");
                return 0;
            }
        } else {
            // 如果用户名或密码长度超出限制,登录失败
            printf("用户名或密码长度超出限制!\n");
            return 0;
        }
    } else {
        // 如果用户名或密码为空,登录失败
        printf("用户名或密码为空!\n");
        return 0;
    }
}

/**
 * 主函数:测试登录验证函数
 */
int main() {
    // 测试情况各种
    // 情况1:用户名和密码正确
    login("admin", "123456");

    // 情况2:用户名或密码错误
    login("user", "password");

    // 情况3:用户名为空
    login(NULL, "123456");

    // 情况4:密码为空
    login("admin", NULL);

    // 情况5:用户名长度超出限制
    login("admin1234567890123456789", "123456");

    return 0;
}

优化后的代码(使用卫语句)

#include <stdio.h>
#include <string.h>

// 定义用户名和密码的最大长度
#define MAX_USERNAME_LEN 20
#define MAX_PASSWORD_LEN 20

/**
 * 使用卫语句优化后的登录验证函数
 * 
 * @param username 用户名
 * @param password 密码
 * @return 返回1表示登录成功,0表示登录失败
 */
int login(const char *username, const char *password) {
    // 卫语句:检查用户名或密码是否为空
    // 如果用户名或密码为空,直接打印错误信息并返回登录失败
    if (username == NULL || password == NULL) {
        printf("用户名或密码为空!\n");
        return 0;
    }

    // 卫语句:检查用户名或密码长度是否超出限制
    // 如果用户名或密码长度超出最大限制,直接打印错误信息并返回登录失败
    if (strlen(username) > MAX_USERNAME_LEN || strlen(password) > MAX_PASSWORD_LEN) {
        printf("用户名或密码长度超出限制!\n");
        return 0;
    }

    // 卫语句:检查用户名和密码是否正确
    // 如果用户名或密码不匹配,直接打印错误信息并返回登录失败
    if (strcmp(username, "admin") != 0 || strcmp(password, "123456") != 0) {
        printf("用户名或密码错误!\n");
        return 0;
    }

    // 正常流程:如果通过了所有卫语句的检查,说明用户名和密码正确,登录成功
    printf("登录成功!\n");
    return 1;
}

/**
 * 主函数:测试登录验证函数
 */
int main() {
    // 测试各种情况
    // 情况1:用户名和密码正确
    login("admin", "123456");

    // 情况2:用户名或密码错误
    login("user", "password");

    // 情况3:用户名为空
    login(NULL, "123456");

    // 情况4:密码为空
    login("admin", NULL);

    // 情况5:用户名长度超出限制
    login("admin1234567890123456789", "123456");

    return 0;
}

或者使用do{......} while(0);

#include <stdio.h>
#include <string.h>

#define MAX_USERNAME_LEN 20
#define MAX_PASSWORD_LEN 20

int login(const char *username, const char *password) {
    int result = 0;
    do {
        // 卫语句:检查用户名或密码是否为空
        if (username == NULL || password == NULL) {
            printf("用户名或密码为空!\n");
            break;
        }

        // 卫语句:检查用户名或密码长度是否超出限制
        if (strlen(username) > MAX_USERNAME_LEN || strlen(password) > MAX_PASSWORD_LEN) {
            printf("用户名或密码长度超出限制!\n");
            break;
        }

        // 卫语句:检查用户名和密码是否正确
        if (strcmp(username, "admin") != 0 || strcmp(password, "123456") != 0) {
            printf("用户名或密码错误!\n");
            break;
        }

        // 正常流程:如果通过了所有卫语句的检查,说明用户名和密码正确,登录成功
        printf("登录成功!\n");
        result = 1;

    } while (0); // 使用do-while(0)结构来模拟卫语句的提前退出

    return result;
}

int main() {
    login("admin", "123456");
    login("user", "password");
    login(NULL, "123456");
    login("admin", NULL);
    login("admin1234567890123456789", "123456");
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2315864.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2024华东师范大学计算机复试上机真题

2024华东师范大学计算机复试机试真题 2023华东师范大学计算机复试机试真题 2022华东师范大学计算机复试机试真题 2024华东师范大学计算机复试上机真题 2023华东师范大学计算机复试上机真题 2022华东师范大学计算机复试上机真题 在线评测&#xff1a;传动门&#xff1a;pgcode…

14.使用各种读写包操作 Excel 文件:辅助模块

一 各种读写包 这些是 pandas 在底层使用的各种读写包。无须安装 pandas&#xff0c;直接使用这些读写包就能够读写 Excel 工作簿。可以尽可能地使用 pandas 来解决这类问题&#xff0c;只在 pandas 没有提供你所需要的功能时才用到读写包。 表中没有 xlwings &#xff0c;因为…

Python数据分析之数据可视化

Python 数据分析重点知识点 本系列不同其他的知识点讲解&#xff0c;力求通过例子让新同学学习用法&#xff0c;帮助老同学快速回忆知识点 可视化系列&#xff1a; Python基础数据分析工具数据处理与分析数据可视化机器学习基础 四、数据可视化 图表类型与选择 根据数据特…

1、操作系统引论

一、操作系统 会使用linux系统 建议大家先学会linux的基础指令&#xff0c;可以看菜鸟教程网站进行学习。 1、各种定义 操作系统定义 管理计算机的 硬件 和软件资源&#xff0c; 能对各类作业进行调度&#xff0c;方便用户使用计算机的程序集合。操作系统运行在内核态&#xf…

HarmonyOS NEXT - 网络请求问题(http)

HTTP&#xff08;HyperText Transfer Protocal&#xff0c;超文本传输协议&#xff09;是一种用于传输超媒体文档&#xff08;如HTML&#xff09;的应用层协议&#xff0c;它是客户端和服务器之间通信的基础&#xff1b;无论是获取数据、提交表单、上传文件&#xff0c;HTTP都扮…

告别旧版本,功能全面升级!

小伙伴们&#xff0c;今天来给大家唠唠一款超经典的软件——格式工厂&#xff01;相信很多人都不陌生吧&#xff1f;它可是早期超多人用的视频格式转换工具呢&#xff01;但随着软件行业的发展&#xff0c;它慢慢被其他工具代替了&#xff0c;像万兴、小丸、AME这些新宠儿一出现…

Obsidian Copilot:打造你的专属 AI 笔记助手

Obsidian Copilot作为一款非常受欢迎的Obsidian插件&#xff0c;不仅极大地提升了用户的笔记管理和信息检索效率&#xff0c;还通过其多样化的AI功能为用户带来了前所未有的便捷体验。本文将详细介绍Obsidian Copilot的核心特点、使用方法及个人体验分享。 核心特点 Obsidian…

VPC4-通达oa-docker逃逸-shiro反序列化-hash传递-CrackMapExec喷射-历史ptt攻击-进程注入

由于本人是菜鸡&#xff0c;不会免杀&#xff0c;所有免杀的部分就直接跳过了 &#xff08;hhh) 靶场地址&#xff1a; 链接: https://pan.baidu.com/s/1Fh1Zg79n1yjCPe6rrQ2apA 提取码: qiag 第一台ubuntu(docker逃逸&#xff0c;shiro反序列化&#xff09; fscan扫到一…

C++类与对象——拷贝构造与运算符重载

拷贝构造函数和赋值运算符重载就是C类默认六个函数之二。 拷贝构造函数&#xff1a; 如果⼀个构造函数的第⼀个参数是自身类类型的引用&#xff0c;且任何额外的参数都有默认值&#xff0c;则此构造函数 也叫做拷贝构造函数&#xff0c;也就是说拷贝构造是⼀个特殊的构造函数…

疗养院管理系统设计与实现(代码+数据库+LW)

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装疗养院管理系统软件来发挥其高效地信息处理的作用&#xf…

2024年12月CCF-GESP编程能力等级认证C++编程四级真题解析

四级真题的难度: 一、总体难度评价 CCF-GESP编程能力等级认证C++四级真题的难度通常被认为相对较高。它不仅要求考生具备扎实的C++编程基础,还需要考生掌握一定的算法和数据结构知识,以及良好的问题解决能力。 二、具体难度分析 ‌理论知识考察‌: 单选题和判断题中,会涉…

MySQL开发陷阱与最佳实践:第1章:MySQL开发基础概述-1.1 MySQL简介与应用场景

&#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 文章大纲 MySQL开发陷阱与最佳实践&#xff1a;第1章&#xff1a;MySQL开发基础概述-1.1 MySQL简介与应用场景1.1.1 MySQL的发展历程与市场地位1.1.2 MySQL的核心特性与技术优势1.1.2…

使用GitHub Actions实现Git推送自动部署到服务器

将网站一键部署到服务器的方案很多&#xff0c;比如纯Shell脚本结合SSH、Jenkins等工具。本文将介绍如何利用GitHub Actions这一免费且轻量的CI/CD工具&#xff0c;实现代码推送后自动部署到云服务器。 之前一直在使用github的工作流&#xff0c;确实是一个比较好用的工具。 我…

PyTorch 系列教程:探索自然语言处理应用

本文旨在介绍如何使用PyTorch进行自然语言处理&#xff08;NLP&#xff09;的基础知识&#xff0c;包括必要的库、概念以及实际代码示例。通过阅读本文&#xff0c;您将能够开始您的NLP之旅。 1. 理解PyTorch PyTorch是一个开源的机器学习库&#xff0c;基于Torch库&#xff0…

3.14-1列表

列表 一.列表的介绍和定义 1 .列表 类型: <class list> 2.符号:[] 3.定义列表: 方式1:[] 通过[] 来定义 list[1,2,3,4,6] print(type(list)) #<class list> 方式2: 通过list 转换 str2"12345" print(type(str2)) #<class str> list2lis…

pyroSAR:开源的SAR数据处理与分析工具

今天为大家介绍的软件是pyroSAR&#xff1a;一款开源的SAR数据处理与分析工具。下面&#xff0c;我们将从软件的主要功能、支持的系统、软件官网等方面对其进行简单的介绍。 pyroSAR官网网址为&#xff1a;https://pyrosar.readthedocs.io/en/latest/。 pyroSAR是一个开源Pytho…

Visual Studio里的调试(debugging)功能介绍

参考 1- Introduction to Debugging | Basic Visual Studio Debugging&#xff08;这是一位印度博主视频&#xff0c;我下面做到笔记也主要参考她的视频&#xff0c;但不得不说口音太重了&#xff0c;一股咖喱味&#xff09; 目录 个人对调试浅显的认识和对调试的介绍逐行调…

图论part4|827. 最大人工岛、127. 单词接龙、463. 岛屿的周长

827. 最大人工岛 &#x1f517;&#xff1a;827. 最大人工岛 - 力扣&#xff08;LeetCode&#xff09;827. 最大人工岛 - 给你一个大小为 n x n 二进制矩阵 grid 。最多 只能将一格 0 变成 1 。返回执行此操作后&#xff0c;grid 中最大的岛屿面积是多少&#xff1f;岛屿 由一…

Java高级-05.反射的作用、应用场景

一.反射的作用 二.案例 Student.class package com.njau.d2_reflect;public class Student {private String name;private int age;private char sex;private double height;private String hobby;public Student(String name, int age, char sex, double height, String …

cherry-studio - 多模型支持的跨平台 AI 桌面助手

GitHub&#xff1a;https://github.com/CherryHQ/cherry-studio 更多AI开源软件&#xff1a;发现分享好用的AI工具、AI开源软件、AI模型、AI变现 - 小众AI 一款支持多种大语言模型服务的跨平台桌面客户端&#xff0c;兼容 Windows、Linux 和 macOS 系统。它支持主流云端模型&am…