Малоизвестные особенности С/С++
Storm:
проверишь на 64 битной платформе - получишь 8 вместо 4 (на настоящей 64 бита типа UltraSparc). С преобразовал символ в число и в программме обработал целую переменную базового типа int. С++ обрабатывал как char - это скорее можно отнести к особенностям компиляторов, хотя стандарты на язык порыть не помешает, если это важно :)
tos:
по моему дело не в самой платформе а в разрядности компилятора, не так ли?
например в VS есть компилятор x86-64
Alder:
Storm, ну дык это и требовалось. Не особенности компилятора, а особенности самого языка получается. Т.е. для С++ мы получим 1, а для С не 1 :)
Sochin:
Смотрим на отличия языков ISO C и C++, описанные в самом Стандарте С++:
Цитировать
Change: Type of character literal is changed from int to char
Rationale: This is needed for improved overloaded function argument type matching. For example:
int function( int i );
int function( char c );
function( ’x’ );
It is preferable that this call match the second version of function rather than the first.
Effect on original feature: Change to semantics of well-defined feature. ISO C programs which depend on
sizeof(’x’) == sizeof(int)
will not work the same as C++ programs.
Difficulty of converting: Simple.
How widely used: Programs which depend upon sizeof(’x’) are probably rare.
Про оператор sizeof:
Цитировать
The sizeof operator yields the number of bytes in the object representation of its operand.
...
sizeof(char), sizeof(signed char) and sizeof(unsigned char) are 1.
Стандарт С++ обязывает рассматривать символьный литерал как объект типа char, размер которого вне зависимости от реализации обязан быть равен одному.
LazarusLong:
1. многие знакомы с тернарным оператором
x = (y < 0) ? 10 : 20;
но далеко не всем известно, что тернарный оператор может быть lvalue, т.е. находится слева от оператора присваивания:
(a == 0 ? a : b) = 1;
Что является сокращением для следующего кода:
if (a == 0)
a = 1;
else
b = 1;
2. в инициализационной части цикла for могут быть объявлены не только переменные но и классы, объекты, структуры, функции и т.д. Например
for(struct { int a; float b; } loop = { 1, 2 }; ...; ...) {
...
}
Навигация