Рассмотрим следующий код:Обычное арифметическое преобразование - лучший набор правил?
void f(byte x) {print("byte");}
void f(short x) {print("short");}
void f(int x) {print("int");}
void main() {
byte b1, b2;
short s1, s2;
f(b1 + b2); // byte + byte = int
f(s1 + s2); // short + short = int
}
В C++, C#, D, и Java, как функция вызывает решимость к «ИНТ» перегрузках ... я уже реализовать это «в спецификации», но почему языки разработаны таким образом? Я ищу более глубокую причину.
Для меня это имеет смысл для результата быть наименьший тип может представлять все возможные значения обоих операндов, например:
byte + byte --> byte
sbyte + sbyte --> sbyte
byte + sbyte --> short
short + short --> short
ushort + ushort --> ushort
short + ushort --> int
// etc...
Это позволит устранить неудобного код, такой как short s3 = (short)(s1 + s2)
, так как так как ИМО гораздо интуитивнее и понятнее.
Это оставшееся наследие со дней C, или есть ли лучшие причины для текущего поведения?
Отмечу, что любая программа с "void main()" не определена стандартами C и C++, и у вас нет причин жаловаться на все, что она делает. Используйте «int main()», если вы собираетесь обсуждать стандартизованное поведение. –
Я упомянул другие языки, кроме C и C++. Подумайте, что это просто псевдокод и ничего больше. После небольших изменений (таких как изменение void на int и байт на char, а также печать на printf и т. Д.), Он будет компилироваться на любом C-подобном языке и демонстрирует поведение, которое я описал. Неужели вы не ожидали, что тот же неизменный исходный файл будет компилироваться на всех упомянутых языках, не так ли? – zildjohn01