Intereting Posts
C Нарушение прав доступа с двойным списком Неожиданный вывод при печати непосредственно в текстовую видеопамять Непоследовательные результаты (C)? Ширина полосы пропускания L1: снижение эффективности на 50% с использованием адресов, которые отличаются на 4096 + 64 байта Код Qt Creator как пользователь, но запускать и отлаживать как root C эквивалент форматированного списка Введите двоичный код вместо hex Клавиши быстрого доступа с экрана блокировки Windows Как проверить, начинается ли строка с определенной строки в C? Подписан правильный сдвиг = странный результат? При привязке клиентского TCP-сокета к конкретному локальному порту с Winsock SO_REUSEADDR не имеет никакого эффекта Objective-C Целочисленная арифметика Является ли сглаживание указателей между агрегатными структурами C и их членами стандартами? Последовательность Фибоначчи в C Эксперименты с использованием sizeof с массивами и указателями

Где я могу использовать & и == при сравнении констант? В чем разница?

Я хочу знать, в чем разница между:

file.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY

а также :

file.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY

когда я использую первый, я получаю больше файлов.

FILE_ATTRIBUTE_DIRECTORY – это константы атрибутов файла, а file.dwFileAttributesWIN32_FIND_DATA структуры WIN32_FIND_DATA в API Windows.

Правило прост:

  • Когда переменная может содержать ровно одно значение, вы проверяете с помощью оператора равенства == .
  • Когда переменная может содержать ноль, один или несколько флагов, вы проверяете наличие флага с побитовым и оператором & .

В случае с dwFileAttributes в документации говорится:

Файловые атрибуты файла. О возможных значениях и их описаниях см. …

Использование множественного числа указывает на то, что применяется вторая из моих пунктов.

& является побитовой и операции, а == является фактическим сравнением.

Побитовое И

 #define FLAG_1 1 #define FLAG_2 2 #define FLAG_3 4 #define FLAG_4 8 /* Check if FLAG_2 or FLAG_3 is enabled in flags */ if ((flags & FLAG_2) || (flags & FLAG_3)) { ... } 

Много ресурсов по поразрядным И и другим основным битовым операциям. Wiki .

Регулярное сравнение

 #define FLAG_1 1 #define FLAG_2 2 #define FLAG_3 4 #define FLAG_4 8 /* Check if flags is *equal* to FLAG_2 value */ if (flags == FLAG_2) { ... } 

file.dwFileAttributes – это целочисленный тип, который используется как флаги. Каждый бит представляет собой флаг (0 или 1 для заданного или не установленного)

FILE_ATTRIBUTE_DIRECTORY – целое число с одним набором бит. (этот бит представляет, является ли файл каталогом)

file.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY возвращает ненулевое значение, если FILE_ATTRIBUTE_DIRECTORY флаг FILE_ATTRIBUTE_DIRECTORY .

file.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY возвращает true, если установлен только один флаг: FILE_ATTRIBUTE_DIRECTORY .