Нередко при изучении алгоритмов встречаются вопросы, связанные с конечным значением переменной после выполнения небольшого фрагмента кода․ Ниже приведено 10 возможных интерпретаций того же самого фрагмента в разных языках и при разных предположениях о том, как именно реализовано деление и остаток․ Это поможет понять, почему одни и те же строки кода могут вести себя иначе․
Вариант 1: Pascal (целочисленное деление) var
a, b, y: Integer;
begin
a := 3;
b := 11;
y := b div a; { 11 div 3 = 3 }
y := y mod 5; { 3 mod 5 = 3 }
writeln('y = ', y); { выводит 3 }
end․
var
a, b, y: Integer;
begin
a := 3;
b := 11;
y := b div a; { 11 div 3 = 3 }
y := y mod 5; { 3 mod 5 = 3 }
writeln('y = ', y); { выводит 3 }
end․Ответ: 3
Вариант 2: Turbo Pascal (с учётом округления в сторону нуля) var
a, b, y: Integer;
begin
a := 3;
b := 11;
y := b div a; { 3 }
y := y mod 5; { 3 }
writeln(y); { 3 }
end․
var
a, b, y: Integer;
begin
a := 3;
b := 11;
y := b div a; { 3 }
y := y mod 5; { 3 }
writeln(y); { 3 }
end․Ответ: 3
Вариант 3: Delphi (целочисленное деление) var
a, b, y: Integer;
begin
a := 3;
b := 11;
y := b div a; { 3 }
y := y mod 5; { 3 }
ShowMessage(IntToStr(y)); { 3 }
end․
var
a, b, y: Integer;
begin
a := 3;
b := 11;
y := b div a; { 3 }
y := y mod 5; { 3 }
ShowMessage(IntToStr(y)); { 3 }
end․Ответ: 3
Вариант 4: C (с оператором %) #include <stdio․h>
int main {
int a = 3, b = 11, y;
y = b / a; /* 11/3 = 3 /
y = y % 5; / 3%5 = 3 /
printf("%d
", y); / 3 */
return 0;
}
#include <stdio․h>
int main {
int a = 3, b = 11, y;
y = b / a; /* 11/3 = 3 /
y = y % 5; / 3%5 = 3 /
printf("%d
", y); / 3 */
return 0;
}Ответ: 3
Вариант 5: C++ (с оператором %) #include <iostream>
int main {
int a = 3, b = 11, y;
y = b / a; // 3
y = y % 5; // 3
std::cout << y << std::endl; // 3
}
#include <iostream>
int main {
int a = 3, b = 11, y;
y = b / a; // 3
y = y % 5; // 3
std::cout << y << std::endl; // 3
}Ответ: 3
Вариант 6: Java (с оператором %) public class Main {
public static void main(String[] args) {
int a = 3, b = 11, y;
y = b / a; // 3
y = y % 5; // 3
System․out․println(y); // 3
}
}
public class Main {
public static void main(String[] args) {
int a = 3, b = 11, y;
y = b / a; // 3
y = y % 5; // 3
System․out․println(y); // 3
}
}Ответ: 3
Вариант 7: Python (целочисленное деление //) a = 3
b = 11
y = b // a # 11//3 = 3
y = y % 5 # 3%5 = 3
print(y) # 3
a = 3
b = 11
y = b // a # 11//3 = 3
y = y % 5 # 3%5 = 3
print(y) # 3Ответ: 3
Вариант 8: JavaScript (оператор / с округлением вперёд) let a = 3;
let b = 11;
let y = Math․floor(b / a); // 3
y = y % 5; // 3
console․log(y); // 3
let a = 3;
let b = 11;
let y = Math․floor(b / a); // 3
y = y % 5; // 3
console․log(y); // 3Ответ: 3
Вариант 9: PHP (оператор %) <?php
$a = 3;
$b = 11;
$y = intdiv($b, $a); // 3
$y = $y % 5; // 3
echo $y; // 3
?>
<?php
$a = 3;
$b = 11;
$y = intdiv($b, $a); // 3
$y = $y % 5; // 3
echo $y; // 3
?>Ответ: 3
Вариант 10: Сложный случай – «y = a3 mod 5» с ошибкой в синтаксисе
Если в исходном фрагменте опечатка и записано y = a3 mod 5, то компилятор (или интерпретатор) выдаст ошибку «неизвестный идентификатор a3» или «некорректный синтаксис»․ В таком случае переменная y не изменится, и её значение останется тем, которое было до ошибки (обычно 0 при объявлении)․
Таким образом, в большинстве языков с корректным синтаксисом и целочисленным делением результатом будет число 3․ При наличии ошибок в коде переменная может остаться неизменной или же вызвать исключение․
- В большинстве современных языков y = 3
- Синтаксические ошибки приводят к тому, что значение y может остаться неопределённым
- Важно знать, как реализовано целочисленное деление в конкретном языке
Надеемся, что эта подборка поможет вам разобраться в нюансах работы с переменными в разных средах программирования․