C ile aritmetik operatörleri çalışırken int iki sayının ondalıklı bölüm yapamadığını fark ettim:
#include <stdio.h>
int main() {
int a = 1;
int b = 2;
float c;
c = a / b;
printf("Result: %f\n", c);
}
Result: 0.000000
c’yi float olarak tanımlamış olsam da 0.5 cevabını alamadım. Ardından a veya b’yi veya her ikisini de float tanımlayınca istediğim sonucu aldığımı gördüm:
#include <stdio.h>
int main() {
int a = 1; //a'da float yapılabilir veya yalnızca a float, b int tanımlanabilir ama bir tanesi bile float yapılırsa istenilen çözüm elde ediliyor.
float b = 2;
float c;
c = a / b;
printf("Result: %f\n", c);
}
Result: 0.500000
Bunun olayı nedir tam olarak? Neden ikisini değil de birini float yapmış olmam bu sonucu aldırabiliyor?
#include <stdio.h>
int main() {
char a = 'A';
int b = 5;
int c;
c = a + b;
printf("%d\n", c); // 70
return 0;
}
Bu örnekte de
a => char
b => int
c => int
Biri char, biri int ama sonuç c=70 geliyor.
#include <stdio.h>
int main() {
char a = 'A';
char b = 'B';
int c;
c = a + b;
printf("%d\n", c); // 131
return 0;
}
Veya bu örnekte
a => char
b => char
c => int
İkisi de char ama sonuç c=131 geliyor.
Yani aslında burada a+b gibi bir expression’daki ifadelerin type’ından ziyade sonucun type’ı önemli. c bir int olduğu için compiler buna göre bir type promotion yapıyor.
A’nın ascii karşılığı 65, B’nin 66 olduğu için 65+66 = 131 verdi.
Yani compiler için senin yazdığın kod şöyle okunuyor:
int a = 1;
float b = 2;
float c;
c = (float)a / (float)b;
/*bu zaten float*/
Veya benzer şekilde
char a = 'A';
char b = 'B';
int c; /* float da olabilirdi, double de olabilirdi... */
c = (int)a + (int)b;
O yüzden C’de şöyle taktikler de yapıyorlar
#include <stdio.h>
int main() {
for (int i = 'a'; i < 'f'; ++i) {
printf("%c", i);
}
printf("\n");
return 0;
}
// 'abcdef' çıktısı veriyor mesela