|  | 
        
            | 
                    
                        | C İpuçları ve Hileleri |  |  
                        | 
	
    
		
            | Gönderiliyor lütfen bekleyin... | 
 |  | 
        
            | Bu yazıda sizlere C’de programlama yaparken kullanabileceğiniz bazı ipuçlarından ve hilelerden bahsetmek istiyorum. Burada anlatacaklarımdan bazıları genel kurallar içinde C programı yazmaya aykırı kod parçaları da olabilir ama adı üstünde, konumuz: "Hileler". 
Eğer bir değişkenin byte’larını ayrı ayrı değiştirmek istiyorsanız, bunu yapmanın kolay bir yolu var.
Örneğin x değişkeninizi unsigned int olarak tanımladınız. Böylelikle x, 2byte’lık bir değişken olmuştur. x değişkeninin 2 byte’ını da ayrı ayrı değiştirmek için, char kullanılır. Char, her zaman bir byte olur. Her byte’ı ayrı ayrı ele
alınıp değiştirmek için derleyiciye o byte’ların char olduğunu göstermemiz gerekir ve sonra da değişiklik yapmamız gerekir:
İlk byte’ı 4 yapalım: *((unsigned char *)&i) = 4;
İkinci byte’ı 15 yapalım:  *(((unsigned char *)&i) + 1) = 15;
Intel tabanlı bilgisayarlarda bu işlemler x’in değerini şöyle değiştirecektir: 15*256+4=3844
Bu hileyi kullanırken bir çok bilgisayar sisteminde değişken tiplerinin farklı kaydedildiklerine dikkat edin. Mesela bir başka sistemde sonuç: 4*256+15=1039 olabilir! Değişken tiplerinin uzunlukları da standard değildir. Bir tamsayı 2 byte iken başka sistemde 1 byte olabilir!
C’deki çok yararlı işlemlerden biri de ?: dir. Örneğin;
i = i == 4 ? 0 : i + 1; kod satırında I 4’ise I’yi sıfırlar, değilse o anki değerine 1 ekler.
Eğer bir değişkenin adres değerini gerçek değerinden daha fazla kullanıyorsanız, her seferinde & işaretini kullanmak yerine 1 elemanlı bir dizi tanımlayabilirsiniz: 
 
  yerine;
    | int main(void) {
 void oku(int *toread), degistir(int *toread), islem(int *toread);
       int deger;
       oku(°er);
       degistir(°er);
       islem(°er);
       printf("%d", deger);
 }
 |  
  kullanılabilir.
Sadece iki değişken ile swap(yer değiştirme) işleminin yapabilir misiniz? İşaretçiler ile biraz düşünülürse bu mümkün!a’nın 1, b’nin 2 olduğunu düşünürsek;
a^=b;
b=^a;
a^=b;
Bu işlem üçüncü bir değişkene gerek kalmadan iki değerin yerini değiştirmemizi sağlar. Ayrıca bu işlem çok hızlıdır. Çünkü;
a’nın 9 (1001 ikilik sistemde), b’nin de 6 (0110 ikilik sistemde) olduğunu varsayalım:
kodda adım adım ilerlersek,
a^=b; : a=a XOR b, a = 1111
b=^a; : b=a XOR b, b=1001
a^=b; : a=a XOR b, a=0110
Sonuç, yer değiştirme tamamlandı!!
İki değer arasında değişip duran bir değişken nasıl elde edilir? Bunu bir örnekle açıklayalım. Örneği istenilen iki değer çevirmek gerçekten de çok kolay. Örneğimizde 8 ve 3 değerlerini seçelim.
    | int main(void) {
 void oku(int *toread), degistir(int *toread), islem(int *toread);
   
    int deger[1];
   
    oku(deger);
   
    degistir(deger);
   
    islem(deger);
   
    printf("%d", *deger);
 }
 |  
 
  Bu kod bizlere 3 ve 8 arasında değişip duran a değişkenini göstermektedir.
a, başlangıçta 3 yapılır. Sonra bir for döngüsünde a değişkenine 11-3 değeri atanır ve 8 
olur. Döngünün diğer tekrarında a değişkenine 11-8 değeri atanır ve böyle sürüp gider.
Bu algoritma için şöyle bir genel formül yaratabiliriz:
x ve y arasında değişen bir değişken için,
sonuç = (x + y) - sonuç ‘tur.
    | int a = 3, i;
for (i = 0; i < 10; i++) {
 a = 11 - a;
         printf("a = %d\n", a);
 }
 |  
                Makale:C İpuçları ve Hileleri C ve Sistem Programlama Tanıl Ergin
 | 
        
            |  | 
        
            |  | 
        
            | 
                    
                        
                            
                        
                            Eklenen Son 10 
                            Bu Konuda Geçmiş 10 
                        
                            Bu Konuda Yazılmış Yazılmış 10 Makale Yükleniyor
                         
                            Son Eklenen 10 Makale Yükleniyor
                         
                            Bu Konuda Yazılmış Geçmiş Makaleler Yükleniyor
                         | 
        
            |  |