Подтвердить что ты не робот

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

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

Например, я никогда не знал, что запятая является фактическим оператором в C. Поэтому, когда я увидел код

if(Foo(), Bar())

Я только что взорвал прокладку, пытаясь выяснить, что там происходит.

Мне любопытно, какие маленькие неиспользуемые углы могут существовать на других языках.

4b9b3361

Ответ 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;
}

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