Слово "семантика" неоднозначно, и вы столкнулись с двумя слегка различающимися значениями в этих разных контекстах.
Первое значение (ваш код) связано с тем, как компилятор интерпретирует код, который вы вводите. Но для этого есть разные степени интерпретации - синтаксис - это один уровень, где интерпретация просто решает, что n1*n2
означает, что вы хотите выполнить умножение. Но здесь также существует более высокий уровень интерпретации - если n1
является целым числом, а n2
является плавающей точкой, каков результат? Что если я произнесу это, должно ли оно быть округлено, усечено и т. Д.? Это скорее "семантические" вопросы, чем синтаксические, но кто-то где-то решил, что да, компилятор может ответить на них для большинства людей.
Они также решили, что у компилятора есть пределы тому, что он может (и должен!) Интерпретировать. Например, он может решить, что приведение к int
является усечением, а не округлением, но не может решить, чего вы действительно хотите, когда вы пытаетесь умножить массив на число.
(Иногда люди решают, что МОГУТ, хотя. В Python [1] * 3 == [1,1,1]
.)
Второе значение относится к гораздо более широкой области. Если предполагается, что результат этой операции будет отправлен на периферийное устройство, которое может принимать значения от 0x000 до 0xFFF, и вы умножаете 0x7FF на 0x010, очевидно, вы допустили семантическую ошибку. Разработчики периферийного устройства должны решить, справиться ли с этим или каким образом. Вы, как программист, также можете принять решение о проверке работоспособности. Но компилятор не имеет ни малейшего представления об этих внешних семантических ограничениях или о том, как их применять (отфильтровать пользовательский ввод? Вернуть ошибку?