Является ли $ оператором в C, если да, то почему?

#c

#c

Вопрос:

У меня возникла эта путаница, когда я работал над преобразованием инфикса в префикс, используя выражение инфикса C: A-B (N $ N)(O P) Q / R ^ S T Z

где я обнаружил, что $ используется в качестве оператора.

Итак, чтобы развеять мои сомнения, я создал программу, выполняющую операцию $ b на C, чтобы посмотреть, дает ли она результаты, подобные другим операторам, но ответа не увидел. Результат еще больше усилил мои сомнения относительно оператора $ и его использования в C.

Если a = 5, b = 6, то, если мы выполним a b и выведем сумму, мы получим 11. В случае $ if мы рассматриваем его как оператор и выполняем $ b, тогда я не получаю никакого результата. Итак, я был смущен тем, является ли $ оператором или нет в случае C

Комментарии:

1. Это не оператор C.

2. где я обнаружил, что $ используется в качестве оператора. — объясните это.

3. Пожалуйста, покажите полную, работоспособную программу, которую вы запускали в качестве теста.

4. Я чувствую запах Хаскелла.

5. I ran a program a$b in C Было ли имя программы a$b , и что означает » ran … в C » точно означает?

Ответ №1:

Некоторые компиляторы (включая GCC) принимают в качестве расширения языка C a $ внутри идентификатора. Вам также может понадобиться поддержка от вашего компоновщика и ассемблера.

Но стандартный C обычно запрещает это. Прочитайте, например, Современный C, чтобы узнать больше, а также проект стандарта n2176. Проверьте также этот справочный веб-сайт C (кажется, $ это разрешено в последних стандартах C).

IIRC, на компьютерах VAX под виртуальными машинами у вас было много системных идентификаторов с a $ .

Я думаю, вы могли бы улучшить какой-нибудь компилятор C с открытым исходным кодом (не только GCC, но и Clang, tinycc, nwcc …), Чтобы принять $ его в качестве некоторого оператора.

Моя рекомендация заключалась бы в том, чтобы не использовать $ ваши идентификаторы и черпать вдохновение из существующего программного обеспечения с открытым исходным кодом (например, GTK).

Например, следующий /tmp/dollar.c файл

 #include <stdio.h>
int main(int argc, char**argv)
{
  int doll$ar = 2;
  printf("from %s doll$ar is %d and argc is %dn", 
         argv[0], doll$ar, argc);
}
 

использование GCC 10 в Linux / x86-64 в декабре 2020 года as gcc -Wall -Wextra /tmp/dollar.c -o /tmp/dollar компилируется без предупреждений. Когда я запускаю /tmp/dollar вывод:

 from /tmp/dollar doll$ar is 2 and argc is 1
 

Немногие программы с открытым исходным кодом (посмотрите на исходный код GNU make или GNU bash) используют $ идентификаторы in .

PS. Я считаю, что будущие стандарты могут допускать использование букв UTF-8 в идентификаторах, но вам нужно проконсультироваться с вашим представителем ISO.

Комментарии:

1. Стандарт C допускает символы Unicode в идентификаторах по крайней мере с 1999 года, а также явно разрешает символы, определенные реализацией.