Тема: Що присвоється змінній, якщо написати с = '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".

Подякували: Ярослав1

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

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

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

Світ врятують краса та масові розстріли
Лепей жывы сабака, чымся здохлы леў
Хто до нас із томагавком прийде, той од томагавка і томагавкнеться
Подякували: Ярослав1

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

Білий Лунь
Подякували: Replace, Torbins2