1

Тема: Що присвоється змінній, якщо написати с = '10';

Пишу такий код:

#include <stdio.h>

main()
{
    int c, d, e;

    c = 10;
    d = '10';
    e = 5;

    while ((c = getchar()) != EOF)
        if(e >= '0' && e <= '10')
            printf("0 <= e <= 10");
    printf("%d %d %d",'10',c,d);
}

У виводі отримую:
'10' = 49;
с = 10;
d = 49;
e = 5;
Прошу пояснити мені, що значить с = '10', що присвоюється змінній?

2

Re: Що присвоється змінній, якщо написати с = '10';

'10' - це рядок з двох символів.
49 - код символу "1".

3 Востаннє редагувалося d4rkc10ud (05.10.2012 18:28:30)

Re: Що присвоється змінній, якщо написати с = '10';

Не буду казать що це напевно, але '10' це просто два символи без кінцевого нуля. Тобто це не рядок. Інтель процесор бачить числа догори дригом, тому два байти (це ASCII коди тих символів) 0x31, 0x30 = 0x3031

4

Re: Що присвоється змінній, якщо написати с = '10';

Відбувається автоматичне перетворення char в int. Другий символ просто ігнорується. Як вже сказали, 49 - ANSI-код символу '1'.

Подякували: Torbins2

5

Re: Що присвоється змінній, якщо написати с = '10';

Керніган і Річі у своїй книзі подають такий приклад:

if (c >= ’0’ && c <= ’9’)

Хоча printf("%d, %d, %d, %d, %d, %d\n", '0', '9', '10', 0, 9, 10); виводить 48, 57, 49, 0, 9, 10 відповідно.
Питання. Автор хоче ввести нас в оману? Чому не написати

if (c >= 48 && c <= 57)

?

6

Re: Що присвоється змінній, якщо написати с = '10';

Бо не всі люди думають ASCII кодами, хоча існують поодинокі випадки написання програм навіть у машинному коді голіруч(без асемблера), але то гики і на комп'ютерах вони гикнулись:)

Подякували: Torbins, Replace, Patron, bunyk5

7

Re: Що присвоється змінній, якщо написати с = '10';

Зрозумів! Це більш зручне використання ASCII кодами.
Тут варто прикласти зображення і пояснити, що позначення
if (c >= ’0’ && c <= ’9’) Означає позначення діапазону символів від 0 до 9 в системі кодів ASCII.
В середині програми, при розрахунках, будуть безпосередньо використовуватись самі коди, в даному випадку діапазон: 48, 49, ... 57.
Умови if (c >= ’0’ && c <= ’9’) і if (c >= 48 && c <= 57) рівносильні, але перша більш естетична.
Як приклад, можна задати іще один діапазон: (c >= ’z’ && c <= ’~’) це буде теж саме, що (c >= 122 && c <= 126) і буде значити діапазон символів z { | } ~.
http://upload.wikimedia.org/wikipedia/commons/thumb/4/42/ASCII_full.svg/217px-ASCII_full.svg.png