C dilinin sözdizimine ne kadar hakimsiniz? Aşağıdaki kurallardan kaç tanesini biliyorsunuz? (Dürüst olun…)
1. Bir bildirimde const ya da volatile belirteçlerini birden fazla kez kullanmak geçerlidir:
1 |
const const const volatile volatile int x = 10; |
2. Dosya bilinirlik alanında (file scope) bir değişken ilk değer verilmemek kaydıyla (tentative definition) birden fazla kez bildirilebilir. Aşağıdaki bildirimler geçerlidir.
1 2 3 |
int x, x, x, x; int x; int x; |
3. Parametre değişkeni gösterici (pointer) olan işlev bildirimlerinin aşağıdaki biçimlerde yapılması derleyici açısından bir farklılık oluşturmaz:
1 2 |
void f1(int *p); void f2(int p[]); |
Ancak tamamlanmamış türler (incomplete types) için birinci biçim geçerli iken ikinci biçim geçerli değildir:
1 2 3 4 |
struct Neco; void f1(struct Neco *p); //gecerli void f2(struct Neco p[]); //gecersiz |
4. C99 öncesinde bir işlevin gösterici parametre değişkeninin kendisinin const olması durumunda (const pointer) bu bildirimi [ ] bildirgeci (declarator) ile yapma olanağı yoktu. Bu olanak C99 standartları ile sağlandı. Aşağıdaki bildirimler birbirine eşdeğer:
1 2 |
void f(int * const ptr); void f(int p [const]); |
5. Aşağıdaki bildirimler birbirine eşdeğerdir:
1 2 3 |
void f(int p[]); void f(int p[20]); void f(int p[static 20]); |
Ancak static anahtar sözcüğünün kullanıldığı bildirim derleyiciye verilen bir ipucu niteliğindedir. Bu durumda derleyici bu işleve adresi gönderilecek dizinin en az 20 boyutunda olacağı yönünde bir bilgi edinir ve bu bilgiyi kullanarak daha iyi bir optimizasyon yapabilir.
6. for döngü deyimiminin birinci kısmında bildirilen isimler ile döngünün ana bloğu içinde bildirilen isimler ayrı bilinirlik alanlarına (scope) sahiptir. C++ dilinde geçerli olmayan aşağıdaki C kodu geçerlidir:
1 2 3 4 5 6 7 8 9 10 |
#include <stdio.h> int main() { for (int i = 0; i < 5; ++i) { int i = 1; printf("%d ", i); //1 1 1 1 1 } return 0; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#include <stdio.h> struct A { int x; } func() { struct A ax = { 34 }; return ax; } int main() { struct A ay = func(); printf("%d\n", ay.x); return 0; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#include <stdio.h> void func(enum { Red, Green, Yellow } x) { int y = Red; printf("%d %d\n", x, y); } int main() { func(1); //func(Red); //Gecersiz } |
1 2 3 4 5 6 7 8 9 |
#include <stdio.h> int main() { size_t n = sizeof(struct A { int x; }) + sizeof(enum { A, B, C }); struct A ax = { 10 }; printf("%zu %d %d\n", n, B, ax.x); } |
1 2 3 4 5 6 7 8 9 10 11 |
#include <stdio.h> int main() { int x = 10; int y = 20; size_t n = sizeof x++ + sizeof (int [y++]); printf("x = %d\n", x); //10 printf("y = %d\n", y); //21 } |