Сделать значение /* для разыменования и деления не для комментариев, добавив специальный символ

У меня есть такой код:

int quotient = 100/*ptr; 

где ptr - указатель на interger.

Но он принимает /* в качестве комментария.
Как я могу сделать значение разделить на значение разыменования указателя? Какой дополнительный особый характер я должен поставить, чтобы иметь этот смысл?

Ответ 1

Это происходит потому, что язык пытался повторно использовать токены. (* в этом случае)

Решение состоит в том, чтобы поместить пробел между / и *, чтобы бить максимальный munch.

int quotient = 100 / *ptr;

Другой способ - добавить скобку или использовать другую локальную переменную:

int quotient = 100/(*ptr);

Ответ 2

Во-первых, вы можете заменить *ptr на ptr[0], поскольку обе имеют одинаковую семантику:

int quotient = 100/ptr[0];

И поскольку индексирование массива является коммутативным, вы можете поменять операнды:

int quotient = 100/0[ptr];

Для случайного читателя это может выглядеть как деление на ноль, но, конечно, [] имеет более высокий приоритет, чем /. Вы можете разместить там пробел на всякий случай:

int quotient = 100/0 [ptr];

Поздравляем, теперь у вас есть работа на всю жизнь!

Ответ 3

Измените его так:

int quotient = 100/(*ptr); 

или

int quotient = 100/ *ptr;

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

Ответ 4

C и С++ используйте максимальное правило munch для анализа токенов. Самая длинная строка соответствия после токена будет следующим токеном.

Следовательно, в int quotient = 100/*ptr; /* будет использоваться один токен вместо двух токенов / и *. Это нежелательный эффект правила.

В некоторых ситуациях "максимальный жеватель" приводит к нежелательным или неинтуитивным результатам. Например, на языке программирования C оператор x=y/*z; (без каких-либо пробелов), вероятно, приведет к синтаксической ошибке, поскольку последовательность символов /* инициирует (непреднамеренный) комментарий, который либо завершен, либо завершен концевым токеном */ некоторого более позднего, несвязанного фактического комментария (комментарии в C не гнездятся). То, что на самом деле означало в заявлении, заключалось в том, чтобы назначить переменной x результат деления значения в y на значение, полученное указателем разыменования z; это был бы совершенно правильный (хотя и не очень распространенный) код. Это можно сформулировать, используя пробелы или используя x=y/(*z);.

https://en.wikipedia.org/wiki/Maximal_munch#Drawbacks

Чтобы исправить это, вам просто нужно добавить пробел, новую строку или другой фиктивный маркер (например, комментарий) для разделения / и *. Вы также можете окружать выражение скобками, как в другом ответе

int quotient = 100/ /* this will work */ *ptr;
int quotient = 100/
    *ptr; // this will also work

Аналогичный вопрос: Почему a+++++b не работает в C?