У меня есть такой код:
int quotient = 100/*ptr;
где ptr — указатель на интергер.
Но это займет /*
как комментарий.
Как я могу сделать значение деления на значение разыменования указателя? Какой дополнительный специальный символ я должен поставить, чтобы иметь это значение?
Это происходит потому, что язык пытался повторно использовать токены. (*
в этом случае)
Решение состоит в том, чтобы поставить пространство между /
а также *
бить по максимуму
int quotient = 100 / *ptr;
Другой способ — добавить круглые скобки или использовать другую локальную переменную:
int quotient = 100/(*ptr);
Во-первых, вы можете заменить *ptr
с ptr[0]
так как оба имеют одинаковую семантику:
int quotient = 100/ptr[0];
И поскольку индексация массива коммутативна, вы можете поменять местами операнды:
int quotient = 100/0[ptr];
Для обычного читателя это может выглядеть как деление на ноль, но, конечно, []
имеет более высокий приоритет, чем /
,
Вы можете разместить там пробел на всякий случай:
int quotient = 100/0 [ptr];
Поздравляю, теперь у вас есть работа на всю жизнь!
C и C ++ используют правило максимального жаворонка разобрать токены. самая длинная строка соответствия после токена будет следующий токен.
Поэтому в int quotient = 100/*ptr;
, /*
будет один токен вместо двух токенов /
а также *
, Это нежелательный эффект правила.
В некоторых ситуациях «максимальный вкус» приводит к нежелательным или не интуитивным результатам. Например, в языке программирования C оператор
x=y/*z;
(без пробелов), вероятно, приведет к синтаксической ошибке, так как/*
последовательность символов инициирует (непреднамеренный) комментарий, который либо не завершен, либо завершен конечным токеном*/
о некоторых более поздних, не связанных фактических комментариях (комментарии в C не вкладываются). Что в действительности подразумевалось в выражении, так это присвоить переменной x результат деления значения в y на значение, полученное разыменованием указателя z; это был бы совершенно правильный (хотя и не очень распространенный) код. Это можно указать, используя пробел илиx=y/(*z);
,
Чтобы это исправить, вам просто нужно добавить пробел, новую строку или другой фиктивный токен (например, комментарий) для разделения /
а также *
, Вы также можете заключить выражение в квадратные скобки, как в другом ответе
int quotient = 100/ /* this will work */ *ptr;
int quotient = 100/
*ptr; // this will also work
Аналогичный вопрос: Почему не a+++++b
работать в C?
Измените это на это:
int quotient = 100/(*ptr);
или же
int quotient = 100/ *ptr;
/*
все вместе используется для многострочных комментариев почти на всех языках, которые я знаю до сих пор.