Dane wyjściowe następującego kodu C to T T
, ale myślę, że powinno to być t t
.Wyjście następującego kodu C to T T, dlaczego nie t t?
#include<stdio.h>
#define T t
void main()
{
char T = 'T';
printf("\n%c\t%c\n",T,t);
}
Dane wyjściowe następującego kodu C to T T
, ale myślę, że powinno to być t t
.Wyjście następującego kodu C to T T, dlaczego nie t t?
#include<stdio.h>
#define T t
void main()
{
char T = 'T';
printf("\n%c\t%c\n",T,t);
}
TL; DR Zmienna nazwa T
podlega MACRO zamiennik, a nie inicjator 'T'
.
Aby opracować, #define
makr powodować zamienniki tekstowe i wszystko wewnątrz „cytatów” (albo ''
lub ""
) nie są częścią MAKRO wymiany.
Tak w istocie, spróbuj uruchomić preprocesora na kodzie (przykład: gcc -E test.c
) i wygląda na to,
char t = 'T';
printf("\n%c\t%c\n",t,t);
Run gcc -E main.c -o test.txt && tail -f test.txt
and See it online
które expectedly, wypisuje wartość zmiennej t
, T T
.
To powiedziawszy, dla hostowanego środowiska, wymagany podpis dla main()
jest co najmniej int main(void)
.
Preprocesor nie zastępuje żadnego tekstu w cudzysłowie, bez względu na to, czy są to pojedyncze cudzysłowy czy podwójne cudzysłowy.
Stała znakowa 'T'
pozostaje niezmieniona.
Z sekcji 6.10.3 z C standard:
Dyrektywa przerób formy
# define identifier replacement-list new-line
określa macro jak powodujący każdy kolejny wystąpienie makro nazwa 171) zostanie zastąpiona przez listę wymiany żetonów przetwarzania wstępnego , które stanowią pozostałą część dyrektywy. Lista zastępcza zostanie następnie ponownie przeskanowana, aby uzyskać więcej nazw makr , jak określono poniżej.
171) Ponieważ od czasu makro zastępczej, wszystkie stałe znakowe i literały łańcuchowe są przerób tokeny, nie sekwencje ewentualnie zawierające podsekwencje identyfikator-like (patrz 5.1.1.2, tłumaczenie fazy), nigdy nie są skanowane pod kątem nazw makr lub parametrów.
nie masz na myśli 'T T'? – DBPriGuy
@DBPriGuy Dobrze, moja zła. Edytowane częściowo. –
@SouravGhosh Ale wyjście to T T, a nie t t. –