Следующий код выводит -1 1
на C++.
Если i
оценивается как -1, почему оно больше 0?
#include <stdio.h>
int main() {
auto i = -1 + unsigned(0);
printf("%d %d\n", i, i > 0);
}
«Если я оценивается как -1»: это не так. Ваш printf
просто неправильный. Избегайте его использования при написании C++. Вместо этого есть std::cout <<
, а с C++20 также std::format
. Сначала спросите себя, какой тип выводит auto
в auto i
. Вы можете проверить свою догадку с помощью static_assert(std::is_same_v<decltype(i), /*guess*/>);
.
Согласно первому ответу: «В вашем случае у нас есть одно целое число без знака и целое число со знаком. Ссылаясь на (3) выше, поскольку оба операнда имеют одинаковый ранг, [...] нужно будет преобразовать целое число без знака. ."
Использование printf
в коде C++ всегда заканчивается слезами.
Если я оценивается как -1
Это неправильная предпосылка.
i
не -1
. Добавление 0u
(или unsigned(0)
) к -1
приводит к unsigned
. Вы можете увидеть -1
как вывод для i
, потому что использование неправильного спецификатора формата с printf
не определено.
Этот
#include <iostream>
int main() {
auto i = -1 + unsigned(0);
std::cout << i << " " << (i>0);
}
не полагается на угадывание типа i
и печатает:
4294967295 1
unsigned(-1)
— наибольшее целое число без знака, которое можно представить как unsigned
.
Используйте
std::cout
, тогда вы не рискуете неправильно угадать типы для спецификаторов формата.