1. Си / Говнокод #19996

    −27

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    #include <stdio.h>
    
    void print_first_three(int a[static 3]) {
        for (int i = 0; i < 3; i++) {
            printf("%i ", a[i]);
        }
        printf("\n");
    }
    
    int main() {
        int nums[] = {1, 2, 3, 4, 5};
        print_first_three(nums);
        return 0;
    }

    int a[static 3], господа. Минусуем те, кто знал о таком.

    In function parameter lists, additional syntax elements are allowed within the array declarators: the keyword static and qualifiers, which may appear in any order before the size expression (they may also appear even when the size expression is omitted).
    In each function call to a function where a parameter of array type uses the keyword static between [ and ], the value of the actual parameter must be a valid pointer to the first element of an array with at least as many elements as specified by expression.

    --http://en.cppreference.com/w/c/language/array

    Запостил: roman-kashitsyn, 13 Мая 2016

    Комментарии (15) RSS

    • плюсанул
      как и [volatile *]
      Ответить
    • Наверное никогда не смогу уверенно сказать, что я знаю эти блядские языки.
      Ответить
      • > эти блядские языки.

        но эти языки все равно намного лучше говно-языков, которые и знать не хочется. но приходится. пример: Visual Basic.
        Ответить
      • но это же C11
        только тем, кому нельзя в С++ и у кого не вижуалстудия, будут сидеть изучать новые сишкограни
        Ответить
      • потому что и не будешь знать ;)
        Ответить
      • Потому что ты петушок
        Ответить
    • Я из текста не понял, что оно делает :(
      Ответить
    • > performs compile-time bounds checking

      А Паскаль за его bounds checking по умолчанию сишники недолюбливают.
      Ответить
    • Если поменять на int nums[] = {1, 2}; то выведет 1 1 2. Оно мусор откуда-то берёт?
      Ответить
      • 1 2 2 в смысле
        Ответить
        • Причём если поменять на static int nums[] = {1, 2}; то выведет 1 2 0.

          Тупой компилятор может проверить только то, что внутри функции не нарушается контракт о доступе не более, чем к трём элементам. А размер передаваемого массива не проверяет.
          Ответить
        • Как обычно, из стека
          Ответить
    • век живи век плюсуй
      Ответить

    Добавить комментарий