Как стать автором
Обновить

Комментарии 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 везде явно типы писал ибо удобно и почему нет. Я раньше не понимал, тех кто гонит программистов-гребцов на галеры, ан нет теперь понимаю, пуст давятся в этих ваших офисах, у меня все пусть ненависть наполнит ваши глаза.
НЛО прилетело и опубликовало эту надпись здесь
Справедливости ради, именно синтаксис нового языка можно выучить и быстрее, если до этого уже на чем-то писал. А вот научиться программировать с нуля — согласен, невозможно.
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
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);
А это старый стандарт.
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
tcl — 1 (то бишь true)

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

что логично — «every value is a string»
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
То есть можно добавить новую операцию сложения, которая внутри себя преобразует результат обычного сложения в строку — здорово! Надо будет почитать про 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

Вообще любую строку или только строковые литералы?
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
язык REXX (regina) — true оба варианта: и 2+2='4' и
2+2="4"
(при дефолтных ключах/настройках ), что документировано и для этого языка логично и ожидаемо.
В общем, самый осмысленный результат выдают JS и PHP.
Антропный коммент кодера на js и php? :)
Если бы я ещё был кодером… ))
Если просто здраво рассудить с точки зрения пользователя, то сравнение 2 + 2 = «4» должно выдавать либо истину, либо ложь, в зависимости от точности запроса. С этой точки зрения самый осмысленный результат выдают JS и PHP.
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
Я так гарантирую, и на каких-нибудь микроконтроллерах так и будет.
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к и нет, ваши знания не устарели и всё так и осталось :)
Статья больше интересна по теме «как компилятор\интерпретатор пишут об ошибках».
По многим сообщениям действительно не сразу понимаешь что именно нужно исправить.
Это серьезное упущение, учитывая, что обычно их допускают новички и для них интерпретация ошибок в новых языках дело затратное и негативно сказывается на обучении, да и опытным программистам приходится часто их видеть.
Так ведь результат в данном случае будет тот же, что строку приводить к числу, что число к строке.
НЛО прилетело и опубликовало эту надпись здесь
Да уж. Исследование.

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

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

Плюсы не так безнадёжны:
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)=?
НЛО прилетело и опубликовало эту надпись здесь
Ну как сказать
"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 будет ложным?
НЛО прилетело и опубликовало эту надпись здесь
Pascal подправте:

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


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

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

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

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории