Размер символа ('a') в C / C++

каков размер символа в C и C++ ? Насколько я знаю, размер char составляет 1 байт как на C, так и на C++.

In C:

#include <stdio.h>
int main()
{
  printf("Size of char : %dn",sizeof(char));
  return 0;
}

В C++:

#include <iostream>
int main()
{
  std::cout<<"Size of char : "<<sizeof(char)<<"n";
  return 0;
}

никаких сюрпризов, оба они дают выход:Size of char : 1

теперь мы знаем, что символы представлены в виде 'a','b','c','|',... Поэтому я просто изменил вышеуказанные коды на эти:

В C:

#include <stdio.h>
int main()
{
  char a = 'a';
  printf("Size of char : %dn",sizeof(a));
  printf("Size of char : %dn",sizeof('a'));
  return 0;
}

выход:

Size of char : 1
Size of char : 4

В C++:

#include <iostream>
int main()
{
  char a = 'a';
  std::cout<<"Size of char : "<<sizeof(a)<<"n";
  std::cout<<"Size of char : "<<sizeof('a')<<"n";
  return 0;
}

выход:

Size of char : 1
Size of char : 1

почему sizeof('a') возвращает различные значения в C и c++?

4 ответов


В C, тип символа постоянный как 'a' на самом деле int, С размером 4 (или некоторым другим значением, зависящим от реализации). В C++ тип char, С размером 1. Это одно из многих небольших различий между двумя языками.


как сказал Павел, это потому что 'a' Это int В C, но a char в C++.

я покрываю эту конкретную разницу между C и C++ в чем-то, что я написал несколько лет назад, по адресу:http://david.tribble.com/text/cdiffs.htm


В C типом символьных литералов являются int и char в C++. Это в C++ требуется, чтобы перегрузка функции поддержки. См. этот пример:

void foo(char c)
{
    puts("char");
}
void foo(int i)
{
    puts("int");
}
int main()
{
    foo('i');
    return 0;
}

выход:

char

на языке C, буквальный символ не является char тип. C рассматривает символьный литерал как целое число. Таким образом, нет никакой разницы между sizeof('a') и sizeof(1).

таким образом, символьный литерал sizeof равен целому числу sizeof в C.

на языке C++, символьный литерал имеет тип char. The cppreference говорят:

1) узкий символ буквальный или обычный символ литерал, например,'a' или '\n' или ''. Такой литерал имеет тип char и значение, равное представление c-char в наборе символов выполнения. Если c-char не представляется в виде одного байта в наборе символов выполнения, литерал имеет тип int и значение, определенное реализацией.

Итак, в C++ символьный литерал-это тип char. таким образом, размер символьного литерала в C++ - это один байт.

Alos, в ваших программах, вы использовали неправильный спецификатор формата для sizeof оператора.

C11 §7.21.6.1 (P9):

если спецификация преобразования является недопустимым, поведение не определено.275) если какой-либо аргумент не правильный тип соответствующая спецификация преобразования, поведение не определено.

Итак, вы должны использовать %zu спецификатор формата вместо %d, иначе это неопределенное поведение С.