Pull to refresh

Comments 84

Pascal
Сообщение об ошибке довольно непонятное

Вполне понятное. Заключите строку в одинарные кавычки.

Pascal

writeln((2 + 2) = «4»);

Fatal: illegal character "'"'" ($22)

Сообщение об ошибке довольно непонятное
В паскале вместо двойных кавычек нужно использовать одинарные.
error: incomparable types: int and String

В сообщение об ошибке всё хорошо кроме того, что не указана какая операция вызвала ошибку.


Как не указано? Incomparable же
error: incomparable types: int and String

В сообщение об ошибке всё хорошо кроме того, что не указана какая операция вызвала ошибку.

Очевидно же, что incomparable может возникнуть только в результате compare — т.е. сравнения.
А почему у вас где-то "=", а где-то "=="? Для разных языков — разная задача?
А то, что где-то написано не "=" и не "==", а «eq» вас не смущает? :)

Вы ещё потребуйте, чтобы кавычки были, как в заголовке поста «4» — это внесёт приятное единообразие в ответы компиляторов :-)

В паскале "=" — это сравнение, а присваивание — ":="
Автор фигней какой-то помаялся, недавно пациента видел который учиться в Израиле, и думает, что static инициализируется каждый раз при обращении, в подкасте РадиоТ о перформансе чет говорят и то, что надо закидывать железом и писать на питоне норм, программисты дорогое удовольствие и тд и тп Боже как же я стал ненавидеть этих ваших хипстеров программистов заполонивших отрасль. Строгая статическая для них не удобная, все знают, что динамическая лучше и конечно же 2+2 = «4» должно быть true, а язык Си — синтаксис которого учиться за две недели для них сложен и вообще. Я даже щупая перегруженный swift везде явно типы писал ибо удобно и почему нет. Я раньше не понимал, тех кто гонит программистов-гребцов на галеры, ан нет теперь понимаю, пуст давятся в этих ваших офисах, у меня все пусть ненависть наполнит ваши глаза.
UFO just landed and posted this here
Справедливости ради, именно синтаксис нового языка можно выучить и быстрее, если до этого уже на чем-то писал. А вот научиться программировать с нуля — согласен, невозможно.
UFO just landed and posted this here
UFO just landed and posted this here
int (*(*(*f3)(int))(double))(float);
Синтаксис typedef на удивление запутанный, но легко запомнить правило «из центра по спирали».

Кстати. кто-нибудь из знающих людей может объяснить, почему при создании алиаса для массива типа X скобки ставятся около нового типа?

typedef int arr[]; // так положено
typedef int[] arr; // но почему не так?

Потому что синтаксис typedef повторяет синтаксис объявления переменных.


Тут надо спрашивать почему объявления переменных сделаны настолько нелогично. Видимо, когда-то давно считалось, что массив — это не отдельный тип данных, а модификатор переменной.

Спасибо! Теперь всё встало на свои места. Легко поверить, что во времена первого C, когда повсеместно использовалась адресная арифметика, было так: тип задает размер указателя, а сколько там элементов подряд идет — один или несколько — это уже модификатор переменной.
Справедливости ради, 90% задач не требуют таких монструозных конструкций, да и C99 позволяет писать вместо этой вакхвнвлии
typedef int (*f1)(float);
typedef f1  (*f2)(double);
typedef f2  (*f3)(float);
А это старый стандарт.
UFO just landed and posted this here
UFO just landed and posted this here
tcl — 1 (то бишь true)

% puts [expr { 2 + 2 == "4" }]
1
%

что логично — «every value is a string»
UFO just landed and posted this here
UFO just landed and posted this here
То есть можно добавить новую операцию сложения, которая внутри себя преобразует результат обычного сложения в строку — здорово! Надо будет почитать про Haskell, хотя бы для общего развития.
А компиляторы/интерпретаторы я использовал какие были на сайте — ставить на рабочий комп такой зоопарк как то не очень хочется.
Lisp:
не важно какой лисп, разные типы
N> (class-of "123")
#<BUILT-IN-CLASS SB-KERNEL:SIMPLE-CHARACTER-STRING>
N> (class-of 123)
#<BUILT-IN-CLASS COMMON-LISP:FIXNUM>

Для python сравниваются разные типы данных
print (2 + 2 == 4)

В Вашем случае будет False, поскольку правая часть выражения является str, а левая int.

Правильней вот так:
print (2 + 2 == 4)
Так в этом и суть(сравнение результата арифметического выражения со строковым представлением правильного результата), или я что-то не понимаю?
суть статьи как раз проверить нестрогое сравнене int и str
будет FALSE, что при выводе на консоль выглядит как пустая строка (если я что-то путаю поправьте меня).те меня)

var_dump (2 + 2 === "4");
// bool(false)

При приведении к типу «строка» false превращается в пустую строку.

>Perl интерпретирует строку «0x4» как 0

Вообще любую строку или только строковые литералы?
UFO just landed and posted this here
UFO just landed and posted this here
язык REXX (regina) — true оба варианта: и 2+2='4' и
2+2="4"
(при дефолтных ключах/настройках ), что документировано и для этого языка логично и ожидаемо.
В общем, самый осмысленный результат выдают JS и PHP.
Антропный коммент кодера на js и php? :)
Если бы я ещё был кодером… ))
Если просто здраво рассудить с точки зрения пользователя, то сравнение 2 + 2 = «4» должно выдавать либо истину, либо ложь, в зависимости от точности запроса. С этой точки зрения самый осмысленный результат выдают JS и PHP.
UFO just landed and posted this here
UFO just landed and posted this here
Я так гарантирую, и на каких-нибудь микроконтроллерах так и будет.
0x00F Ever change the value of 4?
0x010… Unintentionally?
0x011… In a language other than Fortran?
Зависит от окружения, если не ошибаюсь, windows например резервирует начальные адреса для отладки, поэтому под ней строка никогда не окажется по адресу 4
Не для отладки, туда загружаются системные библиотеки если я не путаю и память помечается защищённой от записи.
Мои знания могут быть устаревшими (читал книгу по Рихтеру — на тот момент Windows 2000/98). В тех версиях windows (думаю на данный момент ничего не изменилось) — существовал раздел адресного пространства для выявления нулевых указателей (занимал первые 0xFFFF байт для 32/64 битных версий). Любая попытка чтения/записи из данного раздела запрещена.
Да, я забыл про первые 64к и нет, ваши знания не устарели и всё так и осталось :)
Pascal

writeln((2 + 2) = «4»);

Fatal: illegal character "'"'" ($22)

Сообщение об ошибке довольно непонятное

Глупая статья
Статья больше интересна по теме «как компилятор\интерпретатор пишут об ошибках».
По многим сообщениям действительно не сразу понимаешь что именно нужно исправить.
Это серьезное упущение, учитывая, что обычно их допускают новички и для них интерпретация ошибок в новых языках дело затратное и негативно сказывается на обучении, да и опытным программистам приходится часто их видеть.
Так ведь результат в данном случае будет тот же, что строку приводить к числу, что число к строке.
UFO just landed and posted this here
Да уж. Исследование.

haskell:
λ print $ show $ 2 + 2 == 4
«True»

А в вашем примере вы сравнили 2+2 :: Int
c «4» :: String
И получили ошибку сравнения теплого с мягким. О чем компилятор честно и сказал.
UFO just landed and posted this here
Самый простое и неинтересное поведение — это ошибка компиляции, происходит во всех строго типизированных языках.

Плюсы не так безнадёжны:
cout << (2 + 2 == '4') << endl;
cout << ('2' + 2 == '4') << endl;

пруф
Я в плюсах не эксперт, но помоему строка и char разные типы :)
строка — это массив чаров, но строк в этом примере и нет.
'2' + 2 просто увеличение чара (значение байта) на два '2' == 0x32, 0x32 + 2 = 0x34, что внезапно и есть '4', так что всё логично :)
Тогда вот так:
cout << ("2" - "4" == -2) << endl; //Скомпилируется и, если повезет будет равно true

Вывод:
sh-4.2$ g++ -std=c++11 -o main *.cpp                           
sh-4.2 main                                                                 
1             

пруф
1С: 2+2=«4» False

Адинэснеги встали в ряд гуру C Lisp Python Lua Ruby.
1С выводит False, а не Неправда?))

Powershell:


echo (2+2 -eq "4")
True

То же для одинарных кавычек.
Однако,


"4" -is [string]
True

А если


[int]$a = 2 + 2
[char]$b = "4"
echo ($a -eq $b)
False

При чем тут вообще char? Тут же во всех языках со строками сравнивают, а не с символами.

В С/С++ нет понятия строк в синтаксисе языка, они слишком низкоуровневые для этого. В «С» есть только массив чаров, а в «С++» шаблон стандартной библиотеки являющийся контейнером для некоторого типа данных (чары или «широкие чары») и позволяющий выполнять операции конкатенации и т.п. над последовательностью данных, но это не встроенный тип и более того, можно написать свои собственные «строки» работающие с utf8, к примеру.

В Си/С++ строкой является любой массив байт или указатель на первый элемент такого массива.

То есть int string[10] — тоже строка? Массив байт же.
И это… как бы процитируйте пункт стандарта языка «С» который бы подтвердил Ваши слова.
Я могу процитировать учебник по Си, если Вам интересно:
Язык Си не поддерживает отдельный строковый тип данных, но он позволяет определить строки двумя различными способами. В первом используется массив символов, а во втором — указатель на первый символ массива.

Определение char а[10]; указывает компилятору на необходимость резервирования места для максимум 10 символов. Константа а содержит адрес ячейки памяти, в которой помещено значение первого из десяти объектов типа char.

Ну оговорился я. Символов, конечно же, не байт. Хоть это и "почти синонимы".

Какой это нафиг массив байт?
sizeof(int)=?
UFO just landed and posted this here
Ну как сказать
"4"
— указатель на массив из двух char
'4'
— одиночный char
Типа может и нет, а разница при записи литерала есть
Интересное исследование, сравнить результат сложения двух чисел со строкой. А сразу как бы не понятно что для языков со строгой типизацией результат будет либо ошибкой либо false.
Pascal:
begin
writeln(2+2='4');
end.

Результат:
source.pas(6,17) Error: Incompatible types: got «Char» expected «Int64»
source.pas(8) Fatal: There were 1 errors compiling module, stopping

p.s. для протокола
Кстати, попробовал на стареньком компиляторе TBPascal, вернул:
Error: no common type between integer and string ("=", line 4)
Первый мой коммент был верен для Free Pascal версии 3.0.0 и выше версии, а вот скрин результата Borland Pascal v7 (классика):
image
p.s. теперь думаю ответ можно считать исчерпывающим=) спасибо автору за nostalgie

2 + 2 = «4» это ещё шуточки для JS:


> '5' - 3
2

Отнимаем int от строки, получаем int. А если наоборот?


> '5' + 3
'53'

А если наоборот, то получаем конкатенацию в строку. Неплохо, правда? Ну хорошо, а если от строки отнять строку?


> '5' - '4'
1

… получаем int!


Ещё немного магии. Строка плюс плюс строка:


> '5' + + '5'
'55'

Конкатенация, вроде всё понятно. Ну-ка ещё раз:


> 'foo' + + 'foo'
'fooNaN'

О как!
Ещё JS забавно воспринимает знаки математических действий:


> '5' + - '2'
'5-2'
> '5' + - + - - + - - + + - + - + - + - - - '2'
'52'

И, напоследок, немного javascript-алгебры:


> var x = 3;
> '5' + x - x
50
> '5' - x + x
5

teh end.


Нет, это всё, разумеется, элементарно объясняется

но понять новичку что такое weak typing + implicit conversions, и почему вообще это всё так работает — это целое удивительное путешествие, ЕВПОЧЯ.

Вот совсем неудивительно что в языках со строгой типизацией это не канает. Интереснее было бы, еслиб вы сравнили это выражение без заключения четверки в кавычки.
В каких языках 2 + 2 == 4 будет ложным?
UFO just landed and posted this here
Pascal подправте:

writeln((2 + 2) = '4');


Получите: Incompatible types
Ошибка при отсутствии явного приведения типов — самый верный вариант.
В паскале строки заключаются в ' '.
writeln((2 + 2) = '4');

Error: Incompatible types: got «Char» expected «Int64»
А какой посыл у этой статьи? Я что-то не совсем понял.

Вообще-то в Паскале строки заключаеются в одинарные кавычки. И сообщение об ошибке там вполне понятное.

Sign up to leave a comment.

Articles