Разница в выводе для оператора sizeof для логических значений в C и C ++ - PullRequest
2 голосов
/ 14 марта 2020
#include<stdio.h>
#include<stdbool.h>
int main()
{
    printf("%d",sizeof(true));
    printf("%d",sizeof(false));
}

Вывод приведенного выше кода на C ++ равен 11, а на C - 44. Почему разница в выводе?

Ответы [ 3 ]

2 голосов
/ 14 марта 2020

In C, true и false - это макросы, определенные в <stdbool.h>, которые расширяются до целочисленных констант 1 и 0, которые имеют тип int, для C 2018 7.18 3. Размер int определяется реализацией, а 4 является общим размером.

В C ++ true и false - литералы с типом bool, для проекта C ++ 2017 n4659 5.13.6 1. Размер типа bool определяется реализацией, для C ++ 8.3 .3 1, так что вы можете получить 1 за это, что является распространенным в реализациях C ++.

(Используйте %zu для печати размеров, полученных с sizeof, а не %d.)

1 голос
/ 14 марта 2020

Хотя стандарт C не требует части заголовка cpp, все же, если вы посмотрите на широко используемые компиляторы, такие как реализация G CC файла stdbool.h (аналог Clang), вы увидите

#ifndef _STDBOOL_H
#define _STDBOOL_H

#ifndef __cplusplus

#define bool        _Bool
#define true        1
#define false        0

#else /* __cplusplus */

/* Supporting <stdbool.h> in C++ is a GCC extension.  */
#define _Bool        bool
#define bool        bool
#define false        false
#define true        true

#endif /* __cplusplus */

/* Signal that all the definitions are present.  */
#define __bool_true_false_are_defined        1

#endif        /* stdbool.h */

В C case true и false по сути являются целочисленными литералами, поэтому вы получите sizeof(int). Но в случае C ++ с этим заголовком практически ничего не происходит, поэтому вы получите sizeof(bool), который обычно равен 1, но на самом деле это определенная реализация.

Если вы сделаете это в C ++, вы получите такой же результат, как в C.

#include<stdio.h>
#include<stdbool.h>

#define true 1
#define false 0

int main()
{
    printf("%zu",sizeof(true));
    printf("%zu",sizeof(false));
}
1 голос
/ 14 марта 2020

true и false имеют различные значения в C против C ++.

В C моя копия stdbool.h определяет true и false следующим образом:

#define true         1
#define false        0

То есть оба они являются макросами для литералов 1 и 0 соответственно. В C для литералов числительных c по умолчанию используется тип int, который в большинстве систем составляет 4 байт. Следовательно, у нас есть sizeof(true) == sizeof(false) == sizeof(int), который в вашей системе равен 4.

В отличие от этого, C ++ включает в себя отличительный логический тип. Стандарт не требуется , но большинство реализаций предоставляют bool s, которые занимают только один байт. Это случай в вашей системе, следовательно sizeof(bool) == 1.

...