Какой непонятный синтаксис разрушил ваш день?
Когда вы запускаете синтаксис, который может быть устаревшим, никогда не использоваться или просто запутанным, что вы не могли понять для своей жизни.
Например, я никогда не знал, что запятая является фактическим оператором в C. Поэтому, когда я увидел код
if(Foo(), Bar())
Я только что взорвал прокладку, пытаясь выяснить, что там происходит.
Мне любопытно, какие маленькие неиспользуемые углы могут существовать на других языках.
Ответы
Ответ 1
Синтаксис С++ для конструктора по умолчанию для локальной переменной. Сначала я написал следующее.
Student student(); // error
Student student("foo"); // compiles
Это привело меня к примерно часу чтения через загадочное сообщение об ошибке С++. В конце концов, не-С++ новичок упал, рассмеялся и указал на мою ошибку.
Student student;
Ответ 2
Это всегда раздражает:
std::vector <std::vector <int> >
^
mandatory space.
Ответ 3
При использовании пространства имен System.DirectoryServices
для привязки к ADAM (режим приложения Active Directory, который теперь называется AD LDS, я думаю), я потерял целый день, пытаясь отладить этот простой код:
DirectoryEntry rootDSE = new DirectoryEntry(
"ldap://192.168.10.78:50000/RootDSE",
login,
password,
AuthenticationTypes.None);
Когда я запустил код, я продолжал получать COMException
с ошибкой 0x80005000, которая с успехом сопоставлена с "Неизвестной ошибкой".
Я мог бы использовать логин и пароль и привязываться к порту через ADSI Edit. Но эта простая строка кода не работает. Необычное разрешение брандмауэра? Что-то ввернулось в настройку? Некоторые объекты COM не зарегистрированы правильно? Почему он не работал?
Ответ? Это LDAP://, а не ldap://.
И вот почему мы пьем.
Ответ 4
С++
class Foo
{
// Lots of stuff here.
} bar;
Объявление bar
ОЧЕНЬ сложно увидеть. Чаще всего встречаются в C, но особенно раздражают на С++.
Ответ 5
Синтаксис Perl вызвал у меня плохой день назад:
%table = {
foo => 1,
bar => 2
};
Без надлежащих предупреждений (которые недоступны на платформе, которую я использовал), это создает хеш с одним элементом с ключом в качестве заданной хеш-ссылки и значением undef
. Обратите внимание на тонкое использование {}
, которое создает новую хеш-ссылку, а не ()
, которая является массивом, используемым для заполнения хеша %table
.
Ответ 6
Это глупо и часто, но этот синтаксис:
if ( x = y ) {
// do something
}
Увлек меня примерно три раза в прошлом году на нескольких разных языках. Мне очень нравится соглашение о языке R, использующее < - для назначения, например:
x <- y
Если синтаксис x = y был сделан так, чтобы означать x == y, а x < - y к среднему назначению, мой мозг сделает более плавный переход к математике и программированию и из нее.
Ответ 7
Я был шокирован. Квазитернарный оператор Python не был синтаксической ошибкой при первом просмотре:
X if Y else Z
Ответ 8
С#?? оператор бросил меня на петлю в первый раз, когда я это увидел. По сути, он вернет LHS, если он не равен null, и RHS, если LHS имеет значение null.
object bar = null;
object foo = bar ?? new Student(); // gets new Student()
Ответ 9
Синтаксис битвектора C/С++. Худшая часть этого заключается в попытке Google для этого просто на основе синтаксиса.
struct C {
unsigned int v1 : 12;
unsigned int v2 : 1;
};
Ответ 10
Функция вызова функций Powershell
function foo() {
params ($count, $name);
...
}
foo (5, "name")
Для неэлементов. Это будет работать, но не так, как вы ожидаете. Он фактически создает массив и передает его в качестве первого аргумента. Второй аргумент не имеет явного значения. Правильная версия
foo 5 "name"
Ответ 11
В первый раз, когда я увидел указатель на функцию в С++, я был смущен. Хуже того, потому что синтаксис не имеет ключевых слов, было очень трудно найти. Что именно делает этот тип в поисковой системе?
int (* Foo) (float, char, char);
В итоге мне пришлось спросить у локального гуру С++, что это было.
Ответ 12
VB (да, я должен использовать его) "И" ключевое слово - как в:
If Object IsNot Nothing And Object.Property Then
См. эту ссылку Object.Property после того, как я убедился, что объект не является NULL? Ну, VB "И" ключевое слово * делает * не * блок * дальше * оценка, и поэтому код не будет выполнен.
У VB есть, однако, другое ключевое слово - AndAlso:
If Object IsNot Nothing AndAlso Object.Property Then
Это будет работать так, как вы ожидали бы, и не взорваться при запуске.
Ответ 13
Я когда-то был очень смущен некоторым С++-кодом, который объявлял ссылку на локальную переменную, но никогда не использовал ее. Что-то вроде
MyLock &foo;
(Откажись от синтаксиса, я не делал С++ почти за 8 лет)
Принимая эту, казалось бы, неиспользованную переменную, программа начала умирать неясными способами, по-видимому, не связанными с этой "неиспользуемой" переменной. Итак, я сделал рытье и выяснил, что по умолчанию ctor для этого класса схватил блокировку потока, и dtor выпустил его. Эта переменная защищала код от одновременных обновлений, ничего не делая.
Ответ 14
Javascript: Этот синтаксис...
for(i in someArray)
... предназначен для перебора массивов, или так я думал. Все работало нормально, пока другой член команды не упал в MooTools, а затем все мои петли были сломаны, потому что синтаксис for(i in ...)
также содержит дополнительные методы, которые были добавлены в объект массива.
Ответ 15
Пришлось перевести некоторый научный код из старого FORTRAN в C. Несколько вещей, которые испортили мой день (ы):
Отпечаток перфокарта. Первые шесть символов каждой строки были зарезервированы для контрольных символов, меток goto, комментариев и т.д.:
^^^^^^[code starts here]
c [commented line]
Нумерация в стиле Goto для циклов (в сочетании с 6 отступом пространства):
do 20, i=0,10
do 10, j=0,10
do_stuff(i,j)
10 continue
20 continue
Теперь представьте, что существует несколько вложенных циклов (т.е. от do 20
до do 30
), которые не имеют дифференцировочного отступа, чтобы знать, в каком контексте вы находитесь. О, а завершающие утверждения находятся в сотнях строк.
Утверждение формата, снова используя метки goto. Код написал в файлы (на которые ссылаются номера 1,2 и т.д.). Чтобы записать значения a, b, c в файл, мы имели:
write (1,51) a,b,c
Таким образом, это записывает a, b, c в файл 1, используя оператор формата в строке, помеченной меткой 51:
51 format (f10.3,f10.3,f10.3)
Эти строки format
были в сотнях строк от того места, где они были вызваны. Это было затруднено решением автора напечатать новые строки, используя:
write (1,51) [nothing here]
Я уверенно информирован преподавателем в группе, что я легко вышел.
Ответ 16
Оператор запятой C не кажется мне очень неясным: я все время его вижу, и если бы я этого не делал, я мог бы просто найти "запятую" в индексе K & R.
Теперь триграфы - это другое дело...
void main() { printf("wat??!\n"); } // doesn't print "wat??!"
В Википедии есть отличные примеры из действительно запутывающих:
// Will the next line be executed????????????????/
a++;
к причудливым действиям:
/??/
* A comment *??/
/
И даже не заводи меня на орграфы. Я был бы удивлен, если бы здесь кто-то, кто может полностью объяснить C-орграфы из памяти. Быстро, что у диграфов есть C, и как они отличаются от триграфов при разборе?
Ответ 17
Синтаксис, подобный этому в С++ с включенным /clr. Попытка создать объект управляемого словаря в С++.
gcroot<Dictionary<System::String^, MyObj^>^> m_myObjs;
Ответ 18
Старое:
В PL/1 зарезервированных слов нет, поэтому вы можете определить переменные, методы и т.д. с тем же именем, что и ключевые слова языка.
Это может быть допустимая строка кода:
IF ELSE THEN IF ELSE THEN
(Где ELSE является логическим, и IF и THEN являются функциями, очевидно.)
Ответ 19
Iif (условие, выражение, выражение) - вызов функции, а не оператор.
Обе стороны условного значения ВСЕГДА оцениваются.
Ответ 20
Терминальный оператор PHP связывает слева направо. Это вызвало у меня много мучений, когда я изучал PHP. За предыдущие 10 лет я программировал на C/С++, в котором тройной оператор связывается справа налево.
Мне все еще немного любопытно, почему разработчики PHP решили сделать это, когда во многих других отношениях синтаксис PHP точно соответствует C/С++.
EDIT: в настоящее время я работаю только с PHP под принуждением.
Ответ 21
Он всегда разрушает мой день, если мне нужно читать/писать какую-то польскую нотацию, которая используется во многих калькуляторах HP..
Ответ 22
Не совсем неясно, но всякий раз, когда я слишком много кодирую на одном языке и возвращаюсь к другому, я начинаю испортить синтаксис последнего. Я всегда хихикаю от себя, когда понимаю, что "#if" в C не является комментарием (но скорее чем-то более смертоносным), и что строки в Python не должны заканчиваться точкой с запятой.
Ответ 23
Во время выполнения maintentnace на немного кода на С++ я однажды заметил, что кто-то сделал что-то вроде этого:
for (i=0; i<10; i++)
{
MyNumber += 1;
}
Да, у них был цикл, чтобы добавить 1 к числу 10 раз.
Почему это испортило мой день? Преступник давно уже ушел, и мне пришлось исправлять их модуль. Я думал, что если они будут делать что-то подобное, доброта знает, что еще я собираюсь встретить!
Ответ 24
Синтаксис ассемблера AT & T > : (
Этот контринтуитивный, неясный синтаксис разрушил многие мои дни, например, простую инструкцию по сборке синтаксиса Intel:
mov dword es:[ebp-5], 1 /* Cool, put the value 1 into the
* location of ebp minus five.
* this is so obvious and readable, and hard to mistake
* for anything else */
означает это в синтаксисе AT & T
movl $1, %es:-4(%ebp) /* huh? what "l"? 4 bytes? 8 bytes? arch specific??
* wait, why are we moving 1 into -4 times ebp?
* or is this moving -4 * ebp into memory at address 0x01?
* oh wait, YES, I magically know that this is
* really setting 4 bytes at ebp-5 to 1!
Подробнее...
mov dword [foo + eax*4], 123 /* Intel */
mov $123, foo(, %eax, 4) /* AT&T, looks like a function call...
* there no way in hell I'd know what this does
* without reading a full manual on this syntax */
И один из моих избранное.
Как будто они взяли схему кодирования кода операции и попытались включить ее в синтаксис программирования (read: scale/index/base), но также попытались добавить слой абстракции на типы данных и объединить эту абстракцию в имена опкодов, чтобы вызвать еще большую путаницу. Я не вижу, как кто-то может серьезно программировать с этим.
Ответ 25
На языке сценариев (язык программирования Concordance) для автономного программного обеспечения базы данных (Concordance), используемого для просмотра документа о судебных процессах, массивы были проиндексированы 0, тогда как (некоторые) строковые функции были проиндексированы 1. Я не трогал его с тех пор.
Ответ 26
Это. Я попробовал с ним более одного раза.
Ответ 27
Расширения GNU часто забавны:
my_label:
unsigned char *ptr = (unsigned char *)&&my_label;
*ptr = 5; // Will it segfault? Finding out is half the fun...
Синтаксис указателей-членов также вызывает у меня горе, более того, потому что я не использую его достаточно часто, чем потому, что в нем что-то действительно сложно:
template<typename T, int T::* P>
function(T& t)
{
t.*P = 5;
}
Но, действительно, кому нужно обсуждать неясный синтаксис в С++? С перегрузкой оператора вы можете придумать свои собственные!