Есть ли несогласованность на языке программирования C?

Где-то я читал, что профессор утверждал, что существует некоторая несогласованность в программировании программирования. Это правильно, и если да, то что это?

Я считаю, что я помню, что аргумент, который выдвинул профессор, заключался в том, что вы могли бы что-то сделать с одним типом (может быть, char), но не с другим (возможно, int), и что для согласованности должно быть возможно сделать то, что вы на самом деле можете t с C.

Вы знаете, что я имею в виду здесь, или нет поддержки этому понятию?

Related: <https://stackoverflow.com/questions/3486059/inconsistency-in-programming-languages>

```
char str[] = "Hello";
const char *str2 = "World";

```

If I understand you correctly, the above are 2 features that work meaningfully only for `char`



Есть несколько:

* unlike other types, you can't assign or pass arrays directly as entire objects
* `char x[]` declares either an array or a pointer, depending on where it occurs (in function parameters or not)
* `"str"` behaves either as an array (in `sizeof("str")` or `char s[] = "str"`) or as a pointer (in `puts("str");`)
* `"str"` is of type `char*`, but you can't legally modify what it points to much like if it's `const char*`
* you use `%f` for `double` in `printf()` but you use `%lf` for `double` and `%f` for `float` in `scanf()` and yet you use `f` for `float` constants (e.g. `1.0f`)
* `-1 > 1u`, not quite meaningful
* `UINT_MAX + 1 + 1.0` differs by a lot from `UINT_MAX + 1.0 + 1`, may be quite surprising as well
* etc

Однако есть обходные пути почти везде.



Он  *может*  быть фактом, что  `char`  может быть подписан или неподписанным по умолчанию, тогда как  `int`  всегда подписывается.

Но, хотя это может быть несогласованность между типами, это не то, что я считаю ошибкой - это хорошо понимается (или должно быть).

It may also be that sub-character types (ie, bitfields) are not addressable with the `&` address-of operator whereas other types like `char`, `int` and user-defined structures are. That's because multiple bitfields may be combined at a *single* address.

Я не сомневаюсь, что вы могли найти пятьдесят других незначительных несоответствий в C, ни одна из которых действительно не была бы причиной для того, чтобы вырвать язык.



```
"...is some inconsistency..."

```

Нет, это неверно, есть многочисленные несоответствия, множественное число. Для обозначения всех таких вопросов потребуется эссе многих страниц. Подводя итог: самое худшее, что вы можете сделать, - предположить, что язык C является здравым, последовательным или логичным.

Что касается конкретной проблемы с char, в C есть правило, гарантирующее, что все целые типы неявно подписаны. Например, запись  `int`  всегда полностью эквивалентна записи  `signed int` . Это верно для  `int, long, short, long long` , но не для  `char` .

Это связано с тем, что char - это не только наименьший целочисленный тип, но также используется для хранения символов, то есть значений символов ASCII. Независимо от того, подписан ли char или неподписанный по умолчанию, это определяется реализацией: компилятор может выбрать любую форму.

Причиной этого является, если я правильно помню, какая-то старая проблема обратной совместимости, когда компиляторы C, сделанные до первой стандартизации C, реализовали char по-разному.

Другая проблема с char и другими «малыми целыми типами» (short and bool) заключается в том, что всякий раз, когда они являются частью выражения, они неявно вводятся типами таким образом, который не согласуется с тем, как продвигаются более крупные целочисленные типы. Это известно как  *целые правила продвижения*  и являются частью «обычных арифметических преобразований» (

[1](https://www.securecoding.cert.org/confluence/display/seccode/INT02 -C. + Понять + целое + преобразование + правила «rel =« nofollow »> подробнее здесь </a>), еще один прекрасный пример того, где C - непоследовательный и нелогичный язык.</p>
</div>
                <div class=)[добавлено 29 Январь 2013 в 07:41](https://www.securecoding.cert.org/confluence/display/seccode/INT02 -C. + Понять + целое + преобразование + правила «rel =« nofollow »> подробнее здесь </a>), еще один прекрасный пример того, где C - непоследовательный и нелогичный язык.</p>
</div>
                <div class=)[Lundin](https://stackoverflow.com/users/584518 "Пользователь Lundin")

[источник](https://stackoverflow.com/a/14577936)



Может быть, это, что  `char`  не разрешено заполнять биты, а  `int` : диапазон значений  `unsigned char`  всегда  `2`   `CHAR_BIT`  широкий, в то время как знак  `signed char`  может быть до одного меньше - диапазон для типов  `int`  может 't определяется по его размеру и значению  `CHAR_BIT`  (если только  `CHAR_BIT`  равно 8 и  `sizeof (int)`  2).