Он использует диграфы C, которые были поправками к стандарту C в 1994 году и, следовательно, частью стандарта C99. Заменив орграфы их реальными символами, вы получите:
#include <stdio.h>
#define M(a,b) a##b
main()
{
int a=1, b=2, ab[]={10,20}, c;
printf( "%d", M(a,b)[a] );
printf( "%d", M(a,b)[a]?a:b );
printf( "%d", c=M(a,b)[a]?a:b );
}
Итак, имейте в виду, что a##b
объединит входные данные в один идентификатор. Так как макросу только что переданы a
и b
, результатом будет только ab
, поэтому вы фактически имеете:
main()
{
int a=1, b=2, ab[]={10,20}, c;
printf( "%d", ab[a] );
printf( "%d", ab[a]?a:b );
printf( "%d", c=ab[a]?a:b );
}
Назначение c
на самом деле не имеет значения, поэтому мы можем избавиться от него:
main()
{
int a=1, b=2, ab[]={10,20};
printf( "%d", ab[a] );
printf( "%d", ab[a]?a:b );
printf( "%d", ab[a]?a:b );
}
Теперь давайте избавимся от тернарного оператора (?:
), потому что мы можем работать с ним статически (ab[a]
всегда истинно, потому что a
равно 1, а ab[1]
равно 20, т. е. отлично от нуля):
main()
{
int a=1, b=2, ab[]={10,20};
printf( "%d", ab[a] );
printf( "%d", a );
printf( "%d", a );
}
Теперь замените переменные их фактическими значениями, т. е. ab[a]
на 20
и a
на 1
.
main()
{
int a=1, b=2, ab[]={10,20};
printf( "%d", 20 );
printf( "%d", 1 );
printf( "%d", 1 );
}
person
dreamlax
schedule
01.05.2016
20
, вторая строка1
, третья строка1
. - person user3078414   schedule 02.05.2016