Начнем с самого простого оператора, знака плюс (+). Знак плюс (+) является бинарным оператором, то есть знак плюс соединяет только два числа, а не третье или более чисел.
Следовательно, «1 плюс 2 плюс 3» выражается в компьютере как:
(1 + 2) + 3 // аор
1 + (2 + 3) // bХотя мы обычно пишем это как 1 + 2 + 3, это не означает, что в нашей математике оно эквивалентно 1+2+3.
Так что же в математике 1+2+3 представляет собой a или b?
Если вычисление компьютера левоассоциативно, то это выражение эквивалентно первому типу а, если правоассоциативно, то это выражение эквивалентно второму типу b;
Простое понимание 1 + 2 + 3 — это «сложить 1, 2 и 3 вместе». Действительно, в математике, с которой мы знакомы, это сложение трех чисел. Но в языках программирования дело не только в этом.
Как упоминалось ранее, знак + не может работать с тремя и более числами и может участвовать только в операциях сложения с двумя числами.
Кстати, плюс и минус — это унарные операторы. Хотя они используют те же символы, что и бинарные операторы сложения и вычитания, они разные, поэтому не считайте само собой разумеющимся, что +4 на самом деле эквивалентно 0+4. они не эквивалентны,
+4 — целое число, а 0+4 — выражение сложения, которое дает ровно +4.
В Java мы можем написать короткое a = +4, но когда мы пишем короткое a = 0 + 4, генерируется предупреждение.
Есть еще пример, тоже про короткие,
короткий б = 1;
короткий b = b + 4 // предупреждение
short b += 4; // Без предупреждения. Как же работает 1 + 2 + 3? На языке программирования архитектуры фон Неймана есть побочный эффект - я привык его называть "когда вычислительный процесс компьютера отличается от мыслительного процесса мозга программиста, это называется побочным эффектом" (хотя это в книге так не написано) Да, но я всегда так думал), изначально ты думал, что будет так, но оказывается, что компьютер этого не делает, я называю это побочным эффектом.
Если вы читали предыдущие «Утверждения и выражения», то это можно понять так:
1 + 2 — это выражение, возвращающее значение которого равно 3. Возвращаемое значение этого выражения затем добавляется к другому выражению 3 + 3, и конечный результат равен 6.
Мы перепишем этот код, используя Statement:
// Вычисляем 1 + 2 + 3
вар а = 1 + 2;
var b = a + 3;Если мы вычислим это выражение в lisp, побочных эффектов не будет.
(+ (+ 1 2) 3) Если вам это еще не понятно или этот пример слишком особенный, давайте заменим его на другой.
5 > 4 > 3 В математике это уравнение оказывается верным. Когда мы пишем этот код на языке C, он действительно возвращает false.
Причина та же, что и выше. Знак «больше» (>) является двоичной операцией. Он не может напрямую сравнивать три числа. Результат, возвращаемый 5 > 4, является истиной. Когда true сравнивается с 3, true преобразуется в 1. что равно 1 > 3, конечный результат, естественно, неверен.
Короче говоря, мы возвращаемся к точке зрения из статьи «Операторы и выражения»: каждое выражение в языке программирования имеет значение.
Хотя операторы в языках программирования такие же, как и операторы в математике, они не эквивалентны. Когда вы пишете программу, пишите ее так, чтобы ее могли прочитать люди; когда вы отлаживаете программу, вы должны научиться думать о значении кода с точки зрения компьютера.
Я привык понимать операторы как функции. Например, 2 + 5 на самом деле — это add(2, 5) или 2.add(5). Скажу ли я вам по секрету: «На самом деле это делают многие языки».