netch80: (bird)
netch80 ([personal profile] netch80) wrote2014-07-11 08:51 am

смешное обобщение

В питоне:

print '|%10%|' % ()
print '|%-10%|' % ()


выводит:

|         %|
|%         |


То же самое в перле и FreeBSD libc.

Но glibc выводит простой процент без расширения поля (две строки с |%|), gcc ругается, что формат неправильный, причём он в принципе не опознаёт такую возможность:

t.c:5: warning: conversion lacks type at end of format
t.c:5: warning: unknown conversion type character '|' in format
t.c:6: warning: conversion lacks type at end of format
t.c:6: warning: unknown conversion type character '|' in format


а C99 и Posix хором говорят "The complete conversion specification shall be %% ."

[identity profile] gul-kiev.livejournal.com 2014-07-11 11:28 am (UTC)(link)
Получается, они по-разному трактуют и обрабатывают "%%" в строке формата: одни считают его форматным выводом (хоть и без аргументов), а другие - экранированием. Прикольно. Хотя и непонятно, какая разница.
Лично я всегда воспринимал "%%" как экранирование, и так и реализовывал бы (т.е. как в glibc). А теперь уже не удивлюсь, если, например, $$ в make окажется встроенной readonly-переменной со значением "$". Даже проверил - нет, всё-таки ${$} не работает. :)

[identity profile] d1f.livejournal.com 2014-07-12 12:35 am (UTC)(link)
Не вижу тут gcc'шного кода.

[identity profile] netch80.livejournal.com 2014-07-12 07:52 am (UTC)(link)
Ну, если он не очевиден:

#include <stdio.h>
int main()
{
        printf("|%10%|\n");
        printf("|%-10%|\n");
        return 0;
}

Edited 2014-07-12 07:53 (UTC)

[identity profile] d1f.livejournal.com 2014-07-12 09:51 am (UTC)(link)
Нет, неочевиден.
Удваивания второго процента нет.
Символа типа преобразования нет, не помню, можно ли так.

[identity profile] netch80.livejournal.com 2014-07-12 11:22 am (UTC)(link)
Второй '%' это и есть символ преобразования:)

[identity profile] d1f.livejournal.com 2014-07-12 12:13 pm (UTC)(link)
Ну, значит, нет такого в glibc.