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