Сделать значение /* для разыменования и деления не для комментариев, добавив специальный символ
У меня есть такой код:
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?