Я столкнулся с парой подобных причуд в отношении использования uint как в C ++, так и в C #, и теперь я задаюсь вопросом о причинах (которые могут быть совершенно разными для каждого примера). Для обоих примеров обратите внимание, что я компилирую с уровнями предупреждения, установленными на максимум.
(1) gcc жалуется на сравнение int с uint в следующем, тогда как vc ++ этого не делает:
uint foo = <somevalue>;
if( foo == ~0 ) //right here
...
Сравнение с 0 - это нормально, без приведения на gcc и vc ++.
(2) В C # 3.5 я столкнулся с похожей проблемой. Следующее работает отлично:
uint foo = 1;
uint bar = 2;
Но это выдает предупреждение uint / int:
bool condition = <somevalue>;
uint foo = condition ? 1 : 2; //right here
Что дает, почему компилятор так чувствителен к подписи непосредственных значений? Я полностью понимаю проблему при назначении из переменных, но это не имеет смысла для непосредственных значений; Есть ли какая-то скрытая трудность в разборе, которая не позволяет этому поведению быть разрешенным? Или что?
Редактировать: Да, я знаю, что могу добавить свои числа к суффиксу 'u', но это обходит мой вопрос, который составляет примерно неявно приведение к левой стороне, явно не используется правая сторона.