枚举值的组合使用


    有时候枚举只返回一项会显得不够用,比如新建一个枚举类型week它总共有7项分别代表周日到周一,声明一个week类型的枚举值work用来表示一个人的值日安排,这个人的值日安排可能不止一天,如果work的值只能为week7个枚举项中的一个显然是不够用的。这时候就需要用到枚举的组合。

|和||,&和&&的区别

想要使用枚举的组合就需要知道|和||。&和&&之间的关系

“|”和“||”

“|”和“||”都可以表示逻辑或运算,不同的是做逻辑或运算时”|”会检查每一个条件再进入下一步,而”||”则相反,它会从左往右直到遇到条件为真就立即进入下一步。

“&”和“&&”

“&”和“&&”都可以表示逻辑与运算,不同的是做逻辑与运算时”&&”会检查每一个条件再进入下一步,而”&&”则相反,它会从左往右直到遇到条件为假就跳出然后进入下一步不再检验剩余条件是否成立。这也是”&&“的短路功能。


ps: “&”和”|”与”&&”和”||”相比还多了位运算的功能,当&的两边不是布尔类型时&表示按位与运算;当”|“的两边不是布尔类型时”|“表示按位或运算。**

//test.h
#include<stdio.h>
#include<string.h>
typedef enum WEEK {
    Monday = 1,
    Tuesday = 2,
    Wednesday = 4,
    Thursday = 8,
    Friday = 16,
    Saturday = 32,
    Sunday=64
}Week;

void printWeek(Week src)
{
    char dst[MAXSIZE] = { 0 };
    if ((src&Monday) == Monday)
        strcat(dst, "Monday ");
    if ((src&Tuesday) == Tuesday)
        strcat(dst, "Tuesday ");
    if ((src&Wednesday) == Wednesday)
        strcat(dst, "Thursday ");
    if ((src&Thursday) == Thursday)
        strcat(dst, "Monday ");
    if ((src&Friday) == Friday)
        strcat(dst, "Friday ");
    if ((src&Saturday) == Saturday)
        strcat(dst, "Saturday ");
    if ((src&Sunday) == Sunday)
        strcat(dst, "Sunday ");
    printf("%s", dst);
};
int main()
{
    Week work = Monday | Thursday | Saturday;
    printWeek(work);
    getchar();
    return 0;
}

运行结果如下:
这里写图片描述

这种组合使用是基于二进制和位运算的原理,在定义枚举Week时 每个枚举项的值都为2的次方,转化为二进制就会出出现只有1位为1其他位都为0的情况。这样在两个值为 2的不同次幂的或运算后他们各自的标志位就会整合到一块。再与其它枚举值做按位与就可以知道是否含有此枚举值。

### Qt 中 QDir 枚举的定义与用法 #### 枚举类型概述 `QDir` 提供了几种重要的枚举类型,这些枚举主要用于设置过滤条件、排序选项以及其他目录操作参数。以下是几个核心的枚举类型及其用途: --- #### 1. **QDir::Filter** 该枚举用于指定要列出的文件和目录项的过滤条件。 - 常见枚举: - `AllEntries`: 所有条目(包括文件、目录和其他特殊文件)[^2]。 - `Dirs`: 只匹配目录。 - `Files`: 只匹配普通文件[^2]。 - `Drives`: 匹配驱动器根目录(仅适用于 Windows 平台)。 - `NoSymLinks`: 排除符号链接。 - `TypeMask`: 过滤类型的掩码。 - `Readable`, `Writable`, `Executable`: 分别匹配可读、可写、可执行权限的文件或目录[^2]。 - `Hidden`, `System`: 匹配隐藏文件或系统文件[^2]。 - `CaseSensitive`: 区分大小写的匹配模式。 - 组合使用: 多个过滤条件可以通过按位 OR (`|`) 结合在一起。例如: ```cpp QStringList list = dir.entryList(QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot); ``` --- #### 2. **QDir::SortFlag** 该枚举用于指定条目列表的排序顺序。 - 常见枚举: - `Name`: 按名称排序[^2]。 - `Time`: 按最后修改时间排序[^2]。 - `Size`: 按文件大小排序[^2]。 - `Unsorted`: 不进行任何排序。 - `DirsFirst`: 将目录放在文件之前。 - `Reversed`: 反向排序[^2]。 - `IgnoreCase`: 忽略大小写差异。 - 组合使用: 同样可以组合多个排序标志。例如: ```cpp QStringList sortedList = dir.entryList(QDir::Files, QDir::Name | QDir::IgnoreCase); ``` --- #### 3. **QDir::Permission** 该枚举描述了文件或目录的访问权限。 - 常见枚举: - `ReadUser`, `WriteUser`, `ExeUser`: 用户级别的权限[^2]。 - `ReadGroup`, `WriteGroup`, `ExeGroup`: 组级别的权限。 - `ReadOther`, `WriteOther`, `ExeOther`: 其他用户的权限。 - `ReadOwner`, `WriteOwner`, `ExeOwner`: 文件拥有者的权限。 - 应用场景: 判断某个文件是否具有特定权限时非常有用。例如: ```cpp QFileInfo fileInfo("/path/to/file"); if (fileInfo.isReadable() && fileInfo.permission(QFileDevice::ReadUser)) { qDebug() << "The file is readable by the user."; } ``` --- #### 实际应用示例 以下代码展示如何结合 `QDir::Filter` 和 `QDir::SortFlag` 使用: ```cpp #include <QDir> #include <QStringList> #include <QDebug> int main() { QDir dir("/home/user/documents"); // 设置过滤条件:只显示普通文件,并忽略 "." 和 ".." QStringList fileList = dir.entryList(QDir::Files | QDir::NoDotAndDotDot); // 输出未排序的结果 qDebug() << "Unsorted File List:" << fileList; // 设置排序条件:按名称升序排列 QStringList sortedList = dir.entryList(QDir::Files | QDir::NoDotAndDotDot, QDir::Name); // 输出排序后的结果 qDebug() << "Sorted File List:" << sortedList; return 0; } ``` 在此示例中,`entryList()` 方法分别以默认顺序和按字母表顺序返回文件名列表。 --- #### 总结 通过合理运用 `QDir` 的枚举类型,开发者能够灵活地控制目录遍历行为,从而满足不同的业务需求。无论是简单地列举文件还是复杂地筛选并排序资源,都可以借助这些强大的工具完成。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值