Что означает ~ (тильда) перед функцией scanf в С++?

Я нашел код, который принимает входную строку и распечатывает ее.

Но я не знаю, что означает тильда перед сканфом.

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


int main() {
    char arr;

    while (~scanf("%c", &arr)){
        putchar(arr);
    }
}

person Sean    schedule 27.04.2019    source источник
comment
scanf?? Вы уверены, что хотите использовать это? это фундамент языка c. Вместо этого вы можете использовать std::cin>>.   -  person RC0993    schedule 27.04.2019
comment
Тот, кто это написал, либо слишком умен для своего же блага, либо пытается написать запутанный код. В любом случае лучше выбросить. Есть гораздо лучшие способы читать символ за раз.   -  person Shawn    schedule 27.04.2019
comment
Это побитовый оператор НЕ. Более формально, он возвращает дополнение до единицы возвращаемого значения scanf. scanf возвращает количество успешно просканированных значений или EOF, если он достигает конца файла. EOF — это макрос, представляющий отрицательное значение. На большинстве платформ значение EOF равно (int) -1. В этом случае, взяв дополнение 1 к -1, значение будет равно 0 и используется для выхода из цикла. (Хотел опубликовать это как ответ, но был помечен как дубликат слишком рано, чтобы я мог его напечатать)   -  person Mukul Gupta    schedule 27.04.2019
comment
scanf("%c", &arr) == 1 было бы намного легче читать. Учитывая, что ввод-вывод является фактическим узким местом этого кода, оптимизация почему-то бесполезна (даже если она работает (в чем я немного сомневаюсь, так как неудачный scanf() может вернуть 0 или EOF, и я не уверен, когда это произойдет). первое или второе)).   -  person Scheff's Cat    schedule 27.04.2019


Ответы (1)