Метка «C99»

Хочу рассказать о двух странностях, с которыми мне пришлось столкнуться, программируя вычислительные алгоритмы на языке C.

Итак, первое неожиданное поведение для некоторых программистов. Вот маленькая прога.

#include <stdio.h>
int main()
{
    unsigned char a = 1, b;
    b = ~a >> 1;
    printf("%un", b);
    return 0;
}

Разберем ее. Поразрядная операция ~ инвертирует состояние каждого бита байта a, в который изначально записана единица. В результате должны получить 11111110b, то есть 254. Сдвигая этот байт вправо на один бит, должны получить 127. Однако код, который дает, например, компилятор gcc, выводит в консоль число 255?!

Сначала я подумал о том, что дело в приоритете — вдруг у компилятора приоритет операций «косячит»? То есть будто бы сначала делается сдвиг, а потом — инверсия (а что, логично...). Так в чем же дело?
Читать полностью »

Удачная возможность для веб-разработчиков выучить язык программирования Си — HTML5-парсер Gumbo, реализованный в виде небольшой библиотеки C99 без внешних зависимостей. Парсер создан как строительный блок для создания других инструментов и библиотек, таких как валидаторы, языки шаблонов, инструменты рефакторинга и анализа кода.

Особенности:

  • Полная совместимость со спецификациями HTML5.
  • Устойчивость к некачественным входным данным.
  • Простые API, которые могут быть легко обработаны программами на других ЯП.
  • Поддержка исходных позиций и указателей в оригинальном коде, при навигации по дереву зависимостей.
  • Проходит все тесты html5lib-0.95.
  • Проверен на более чем 2,5 млрд страниц в индексе Google.

Читать полностью »

Для начала несколько вопросов:

  1. Тип char по умолчанию знаковый или нет? А int?
  2. Сколько бит в char?
  3. Какое максимальное число гарантированно можно поместить в int? А минимальное?
  4. Тип long определённо больше, чем char, не так ли?

Разумеется, экспериментально искать ответы на эти вопросы с помощью вашего любимого компилятора в вашей любимой системе на вашем любимом компьютере1 — не лучшая идея. Мы говорим о стандарте языка (С99 и новее).

Если вы уверенно сможете правильно ответить на эти вопросы, тогда эта статья не для вас. В противном случае десять минут, потраченные на её чтение, будут весьма полезны.

Предположу, что вы ответили

  1. Знаковые оба.
  2. 8.
  3. 2147483647. -2147483648.
  4. Конечно, кэп.

А правильные ответы такие

  1. char — не регламентируется, int — знаковый.
  2. Не менее 8.
  3. 32767. -32767
  4. Вообще говоря, нет.

Читать полностью »

в 1:55, , рубрики: c++, C99, метки: ,

В декабре 2011 года был утверждён стандарт ISO/IEC 9899:2011, он же C11 или C1X, новый стандарт для языка программирования C.

Дэнни Калев (Danny Kalev), бывший член комитета стандартизации C++, вкратце объясняет, в чём суть главных нововведений в C11: новая модель памяти для лучшей поддержки многопоточности, анонимные структуры и объединения и многие другие функции, которые уже присутствуют в C++.

Некоторые обязательные функции C99 становятся опциональными в C11 (массивы переменной длины, комплексный тип данных и др.), но добавляются некоторые функции C++. Комитеты C и C++ плотно сотрудничали, чтобы обеспечить максимальную совместимость языков.
Читать полностью »