Я использую p для сохранения результата из предыдущей замены рекурсии:
function replaceAll(s, m, r, p) {
return s === p || r.contains(m) ? s : replaceAll(s.replace(m, r), m, r, s);
}
Он заменит все вхождения в строке s до тех пор, пока это не будет возможно:
replaceAll('abbbbb', 'ab', 'a') → 'abbbb' → 'abbb' → 'abb' → 'ab' → 'a'
Чтобы избежать бесконечного цикла, я проверяю, содержит ли замена r совпадение m:
replaceAll('abbbbb', 'a', 'ab') → 'abbbbb'
Первое объявление сообщает компилятору, что someArray
имеет не менее 100 элементов. Это можно использовать для оптимизации. Например, это также означает, что someArray
никогда не имеет значения NULL.
Обратите внимание, что стандарт C не требует, чтобы компилятор диагностировал, когда вызов функции не отвечает этим требованиям (т. Е. Это бесшумное неопределенное поведение ).
Второе объявление просто объявляет someArray
(а не элементы someArray
!) как const, т. е. вы не можете писать someArray=someOtherArray
. Это то же самое, что и параметр char * const someArray
.
Этот синтаксис можно использовать только в самом внутреннем []
объявителя массива в списке параметров функции, это не имеет смысла в других контекстах.
Стандартный текст, который охватывает оба вышеуказанных случая, находится в C11 6.7.6.3/7 (был в формате 6.7.5.3/7 в C99):
Объявление параметра «массив типа» должен быть скорректирован на «квалифицированный указатель на тип», где квалификаторы типа (если они есть) являются теми, которые указаны в
blockquote>[
и]
для вывода типа массива. Если ключевое слово static также появляется внутри[
и]
вывода типа массива, то для каждого вызова функции значение соответствующего фактического аргумента должно обеспечивать доступ к первому элементу массива, по меньшей мере, как многие элементы, указанные выражением размера.