Комментарии 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 — т.е. сравнения.
typedef
на удивление запутанный, но легко запомнить правило «из центра по спирали».Кстати. кто-нибудь из знающих людей может объяснить, почему при создании алиаса для массива типа X скобки ставятся около нового типа?
typedef int arr[]; // так положено
typedef int[] arr; // но почему не так?
Потому что синтаксис typedef повторяет синтаксис объявления переменных.
Тут надо спрашивать почему объявления переменных сделаны настолько нелогично. Видимо, когда-то давно считалось, что массив — это не отдельный тип данных, а модификатор переменной.
typedef int (*f1)(float);
typedef f1 (*f2)(double);
typedef f2 (*f3)(float);
А это старый стандарт.% puts [expr { 2 + 2 == "4" }]
1
%
что логично — «every value is a string»
А компиляторы/интерпретаторы я использовал какие были на сайте — ставить на рабочий комп такой зоопарк как то не очень хочется.
не важно какой лисп, разные типы
N> (class-of "123")
#<BUILT-IN-CLASS SB-KERNEL:SIMPLE-CHARACTER-STRING>
N> (class-of 123)
#<BUILT-IN-CLASS COMMON-LISP:FIXNUM>
print (2 + 2 == 4)
В Вашем случае будет False, поскольку правая часть выражения является str, а левая int.
Правильней вот так:
print (2 + 2 == 4)
будет FALSE, что при выводе на консоль выглядит как пустая строка (если я что-то путаю поправьте меня).те меня)
var_dump (2 + 2 === "4");
// bool(false)
Вообще любую строку или только строковые литералы?
2+2="4"(при дефолтных ключах/настройках ), что документировано и для этого языка логично и ожидаемо.
0x010… Unintentionally?
0x011… In a language other than Fortran?
Pascal
writeln((2 + 2) = «4»);
Fatal: illegal character "'"'" ($22)
Сообщение об ошибке довольно непонятное
Глупая статья
По многим сообщениям действительно не сразу понимаешь что именно нужно исправить.
Это серьезное упущение, учитывая, что обычно их допускают новички и для них интерпретация ошибок в новых языках дело затратное и негативно сказывается на обучении, да и опытным программистам приходится часто их видеть.
print 2+2 eq "4" ? "TRUE" : "FALSE";
# > TRUE
haskell:
λ print $ show $ 2 + 2 == 4
«True»
А в вашем примере вы сравнили 2+2 :: Int
c «4» :: String
И получили ошибку сравнения теплого с мягким. О чем компилятор честно и сказал.
Адинэснеги встали в ряд гуру C Lisp Python Lua Ruby.
Powershell:
echo (2+2 -eq "4")
True
То же для одинарных кавычек.
Однако,
"4" -is [string]
True
А если
[int]$a = 2 + 2
[char]$b = "4"
echo ($a -eq $b)
False
При чем тут вообще char? Тут же во всех языках со строками сравнивают, а не с символами.
В Си/С++ строкой является любой массив байт или указатель на первый элемент такого массива.
И это… как бы процитируйте пункт стандарта языка «С» который бы подтвердил Ваши слова.
Я могу процитировать учебник по Си, если Вам интересно:
Язык Си не поддерживает отдельный строковый тип данных, но он позволяет определить строки двумя различными способами. В первом используется массив символов, а во втором — указатель на первый символ массива.
Определение char а[10]; указывает компилятору на необходимость резервирования места для максимум 10 символов. Константа а содержит адрес ячейки памяти, в которой помещено значение первого из десяти объектов типа char.
"4"
— указатель на массив из двух char'4'
— одиночный charТипа может и нет, а разница при записи литерала есть
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. для протокола
Error: no common type between integer and string ("=", line 4)
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 будет ложным?
writeln((2 + 2) = '4');
Получите: Incompatible types
writeln((2 + 2) = '4');
Error: Incompatible types: got «Char» expected «Int64»
Вообще-то в Паскале строки заключаеются в одинарные кавычки. И сообщение об ошибке там вполне понятное.
Когда 2 + 2 = «4»