C'de Bölme Operatörü ve Veri Tipleri Hk

Merhaba,

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?

Teşekkürler.

Merhaba.

#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
2 Beğeni

Standart (degil ama yakin bir dokuman): https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3096.pdf

Iki tamsayi arasindaki bolum tamsayi bolumu oluyor: §6.5.5#7
(#4’te bahsedilen cevrimler de §6.3.1.8’de bu arada)

Sonucun nereye atandigi onemli degil, onun cevrimi daha sonra oluyor. (§6.5.16.1#2)

3 Beğeni

Üniversiteden dolayı şimdilik geçici bir yoğunluğum var, bir hafta içerisinde konuya dönüp yanıtlamayı deneyeceğim.