Что означает статическое значение в int [static 10]? [Дубликат]

Я использую 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'
124
задан Ciro Santilli 新疆改造中心 六四事件 法轮功 10 May 2016 в 20:23
поделиться

1 ответ

Первое объявление сообщает компилятору, что 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):

Объявление параметра «массив типа» должен быть скорректирован на «квалифицированный указатель на тип», где квалификаторы типа (если они есть) являются теми, которые указаны в [ и ] для вывода типа массива. Если ключевое слово static также появляется внутри [ и ] вывода типа массива, то для каждого вызова функции значение соответствующего фактического аргумента должно обеспечивать доступ к первому элементу массива, по меньшей мере, как многие элементы, указанные выражением размера.

105
ответ дан M.M 27 August 2018 в 07:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: