char *str = "Привет мир!";. их ответ отличается от ответа онлайн кодеров
For signed and non-negative a, if a * 2^b
is representable in the unsigned version of the return type, then that value, converted to signed, is the value of a << b (this makes it legal to create INT_MIN as 1<<31); otherwise the behavior is undefined.
Изначально очистки не было и из-за этого криво отображалось.
Код должен посчитать сколько введен каждый символ в строке, строку сам задаешь
unsigned count[256];
memset(count, 0, sizeof(count));
// Считаем количество символов
for(int i=0; a[i] != '\0'; ++i) {
++count[a[i]];
}
// вывод
for(int i=0; i < 256; ++i) {
if(count[i] > 0)
printf(" %c=%d\n ", (char)i, count[i]);
}
Прочитал статью, там UB только при использовании отрицательных значений.
Таким образом, в нашем примере сдвиг влево это не UB, но его результат будет отрицательным, и тогда уже UB - это следующий сдвиг вправо. Хотя тут в ассемблере - "арифметический сдвиг" с вполне понятным результатом для отрицательных чисел. Но с точки зрения стандартов С++ все сдвиги с отрицательными операндами UB.