Amigo писал(а):
SAA
Ничего там по делу нет, спорят что "моя лучше чем твоя"...
Кое-что есть, например ты наверняка узнал что есть такие языки как функциональные, понятие метапрограммирование. Почему С++ и Си разные языки в некотором роде, и почему С++ надо пользоваться аккуратно. Остальное стеб - согласен.
Цитата:
Кстати, прошлый раз хотел спросить, чем ты отделяешь бейсико-подобный язык от Си и прочего подобного? Те же циклы, те же условия.
Прежде всего "Си-подобный" - так не говорят, например Pascal, Modula, Oberon, Algol, PL/1, Ada, Fortran, Рапира совсем не Си подобны. Это как с животными - есть вид, а есть семейство. Бэйсик в первую очередь не компилируемый язык и этим сильно отличается от языков компилируемых. Второе Бэйсик язык с автоматическими приведениями типов и автоматическими переменными. Это значит буквально следующее - фактически память под переменные распределяется автоматически по требованию.
10 A = 10
20 A = 10.20
30 A = 1234567890123432
В первом случае значение вполне влезает в байт, во втором это уже не целочисленное значение, в третьем случае это целочисленное значение которому и двух байт мало. При этом язык не запрещает использовать одну и ту же переменную для хранения всех указанных значений. Это означает что некий менеджер памяти постоянно перераспределяет память под переменную с именем А.
10 A = 10
20 B = 0.0001
30 A = A + B
В этом случае производиться автоматическое приведение типов в выражении так как складываются целочисленное значение и вещественное, а для их сложения используются разные функциональные устройства процессора. Приведение происходит в сторону вещественного. Поэтому в случае указанном ниже несмотря на то что B уже вполне можно привести к целому числу автоматическое приведение типа будет производиться к вещественному значению. При этом опять таки менеджер памяти (менеджер кучи) перераспределит место под A.
10 A = 10
20 B = 9.99
30 B = 9.99 + 0.01
40 A = 10 + B
В Си, Pascal и прочих приведенных выше во главу угла поставлена типизация так как во время исполнения программы никаких изменений кода произведено быть не может, компиляция транслирует все в код процессора а там на самом деле нет ни каких А или B а есть только регистры процессора и ячейки памяти которые могут быть представлены в рамках аппаратной платформы разными типами целый, знаковый целый, вещественный и размеры переменных тоже выделяются жестко на этапе компиляции и входят в понятия ТИПА переменной.
var
A : integer;
begin
A := 10;
A := A + 0.01;
Этот код даст ошибку на этапе компиляции так как тип переменной A не предусматривает работы с вещественными значениями числа.
{
unsigned char i = 22;
short unsigned int a = 1100;
i = i + a;
}
Этот код выдаст предупреждение (может быть ошибку в зависимости от компилятора) но после запуска программа выдаст результат i = 98. Потому что размер i это байт а он не вмещает в себя все разряды суммы указанной выше, только последние восемь ее разрядов будут записаны в переменную.
{
unsigned char i = 250;
if(i < 0)
{
puts("Это строка может быть не будет напечатана никогда");
}
}
В фрагменте кода выше в рамках стандарта ни когда не будет выполнена тело условия, так как переменная i без знаковое целое размером в байт, находящиеся в границах значений 0...255. Именно по этому она никогда не будет рассматриваться процессором при сравнении с числом на отрицательную величину. В принципе при компиляции будет получено предупреждение, однако не всякий компилятор способен отловить это нюанс.
{
unsigned char i = 255;
char a;
a = i;
a = 200 - a;
}
В этом фрагменте кода полученное значение a будет равняться 11, а не -55 и вовсе не потому что значение больше размера переменной (он в границах для целого со знаком размером в байт -128...127), а потому что при первом присваивании тип i не будет учтен для типа а, значение 255 это -1.
Как считаешь достаточно серьезные различия у Бейсика и допустим Си, Паскаль?