Раз уж зашёл разговор о редко используемых и малоизвестных возможностях.
И С, и С++ позволяют символьные литералы из нескольких символов. Одно требование — должно влазить в int.
Т.е. на платформе с 16-битным int позволяется запись 'AB', с 32-битным — 'ABCD'.
Размещение в памяти зависит от порядка следования байтов на заданной платформе. Самый правый символ сидит в младшем байте числа, а не по младшему байту памяти, например,
Код: Выделить всё
'AB' == ('A' << CHAR_BIT) | 'B';Код: Выделить всё
#include <stdio.h>
int a = 'ABCD';
int main()
{
printf( "%4.4s\n", (char *)&a );
return 0;
}Код: Выделить всё
DCBA«точность» в спецификаторе формата вывода строки выполняет ту же роль, что и длина в strncpy()
Тут тоже есть тонкое различие между C и C++.
С: тип литералов 'A' и 'AB' — int
С++: тип литерала 'AB' — int, а вот 'A' - char.
Т.е. односимвольные литералы в C++ сменили тип с int на char, это сделано для возможности их ввода/вывода операторами >> и <<
Код: Выделить всё
#include <iostream>
int main()
{
std::cout << "1-ch literal (" << 'A' << "), 2-ch literal (" << 'AB' << ")" << std::endl;
}Код: Выделить всё
1-ch literal (A), 2-ch literal (16706)