Основные типы - PullRequest
       32

Основные типы

2 голосов
/ 12 марта 2010

Я всегда думал, что следующие типы являются "фундаментальными типами", поэтому я думал, что мой ответ на этот вопрос будет правильным, но на удивление он получил отрицательную оценку ...

Поиск в Интернете, я нашел это . Итак, IBM говорит, что эти типы являются фундаментальными типами.

Ну, как вы интерпретируете Стандарт? Являются ли следующие типы (и похожие типы) "основными типами" согласно стандарту C ++?

unsigned int
signed char
long double
short int
unsigned short int

РЕДАКТИРОВАТЬ:
Снова связано с этим вопросом : Comceau и gcc не рассматривают такие типы, как "long double", "short int" или "unsigned int" как "фундаментальный тип"! (тогда как компиляторы IBM, Intel и Microsoft делают ..) Если они относились к таким типам как к фундаментальным, должен скомпилироваться следующий код: short int i = short int()

EDIT:
удалены long long типы, так как я забыл, что они официально еще не являются стандартными ..

Ответы [ 4 ]

5 голосов
/ 12 марта 2010

long long не поддерживается текущим стандартом ISO C ++ 03.Однако проект стандарта C ++ 0x включает этот тип:

3.9.1 Основные типы

2 Существует пятьстандартные целочисленные типы со знаком: «подписанный символ», «короткое целое», «int», «длинное целое» и «длинное длинное целое».

ISO C99 добавил этот конкретный тип данныхэто было / доступно на многих компиляторах как нестандартное расширение).C ++ 03 не полностью поддерживает все функции C99.Однако некоторые компиляторы C ++ допускают это как расширение (например, для Comeau требуется --long_long).

4 голосов
/ 12 марта 2010

Ваша логическая ошибка в вашем другом ответе уже была объяснена другими. Позвольте мне объяснить вам еще раз, учитывая это утверждение:

Спецификаторы простого типа указывают либо ранее объявленный пользовательский тип, либо один из основных типов.

Это не означает, что существуют простые спецификаторы типов для всех основных типов. Это просто означает, что каждый спецификатор простого типа (или их комбинация - я думаю, это предложение не очень понятно) указывает либо определенный пользователем тип, либо один из фундаментальных типов. Это утверждение также применимо к следующим «спецификаторам выборки»:

sample-specifier:
  int
  class-name

Каждый из моих спецификаторов выборки указывает либо ранее объявленный пользователем определенный тип, либо один из основных типов (в моем случае это int). Это не означает, что все ранее объявленные пользовательские типы могут быть обозначены, равно как и все основные типы могут быть обозначены. Теперь, если в другом параграфе Стандарта сказано, что type() работает для type как спецификатор простого типа, это не означает, что он также должен работать для их комбинации. Это совершенно неверное заключение.

Это как когда я говорю "десятичные цифры указывают исключительно числа от 0 до 9", а вы говорите "вы не правы, потому что они не могут указать число 10". Но то, что вы сделали, это взяли комбинацию из двух цифр, а затем заявили что-то, чего я никогда не говорил. Я думаю, что это довольно четкая логическая ошибка, которую вы делаете.

1 голос
/ 12 марта 2010

Infact, unsigned / long / short - это вариант типа int. Таким образом, вы можете использовать любую комбинацию этих ключевых слов вместе (например, unsigned short int);

Но long long еще не является стандартным: он поддерживается многими компиляторами и будет стандартным в C ++ 0x (грядущий стандарт).

0 голосов
/ 13 марта 2010

Я только что посмотрел на новейший черновик стандарта N3035 , и он включает дополнительную таблицу (§7.1.6.2), в которой перечислены все действительные спецификаторы простого типа и показано, что unsigned int и подобные типы на самом деле являются комбинациями простых спецификаторов типов .

simple-type-specifier:
    ::opt nested-name-specifieropt type-name
    ::opt nested-name-specifier template simple-template-id
    char
    char16_t
    char32_t
    wchar_t
    bool
    short
    int
    long
    signed
    unsigned
    float
    double
    void
    auto
    decltype ( expression )
type-name:
    class-name
    enum-name
    typedef-name
...