Какой непонятный синтаксис разрушил ваш день?

Когда вы запускаете синтаксис, который может быть устаревшим, никогда не использоваться или просто запутанным, что вы не могли понять для своей жизни.

Например, я никогда не знал, что запятая является фактическим оператором в 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;
}

Но, действительно, кому нужно обсуждать неясный синтаксис в С++? С перегрузкой оператора вы можете придумать свои собственные!