Это не с.
void scanint(int &x) {/* Whatever */}
// ^^
Определяет функцию, принимающую ссылку на int
, и в c нет ссылок, аргументы передаются по значению в функции. Конечно, вы можете использовать указатель на int
, но тогда тело функции должно быть соответствующим образом изменено, используя *x
вместо вхождений муравья x
.
Далее предполагается, что gc()
обозначает функцию, аналогичную getchar()
, поэтому отправленный код представляет собой очень плохой способ извлечения значения int
из stdin
:
void scanint(int &x) // Or 'int *x' in C
{
int c = gc(); // register was deprecated in C++17
bool is_negative = (c == '-'); // C has bool from C99 too
x = 0; // '*x = 0;' in C. The same applies to the following code
// Considering only ASCII, ignores non-digit characters
// E.g. from " 123" it ignores the first two spaces,
// but, given " -123", it will ignore the sign too. Bad, as I said.
for( ;
( c < '0' || c > '9');
c = gc() )
;
// Now computes the actual number using an old trick that should
// be left to the compiler to be exploited:
// 10 * x = (2 + 8) * x = 2 * x + 8 * x = x << 1 + x << 3 (bit shifts)
for( ;
'0' <= c && c <= '9';
c = gc() )
{
x = (x << 1) + (x << 3) + c - '0';
}
if ( is_negative )
x = -x;
}