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

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

int quotient = 100/*ptr;

где ptr — указатель на интергер.

Но это займет /* как комментарий.

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

12

Решение

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

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

int quotient = 100 / *ptr;

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

int quotient = 100/(*ptr);
33

Другие решения

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

int quotient = 100/ptr[0];

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

int quotient = 100/0[ptr];

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

int quotient = 100/0 [ptr];

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

25

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

Поэтому в 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?

13

Измените это на это:

int quotient = 100/(*ptr);

или же

int quotient = 100/ *ptr;

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

13
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector