int, double, char, bool, std::string, const ve auto; tam sayı bölmesi, taşma ve ADC dönüşümü örneğiyle.
Değişken, bellekte bir değeri saklayan ve ona isim veren kutudur. C++ statik tipli bir dildir: her değişkenin tipi derleme anında bellidir ve sonradan değişmez. Bu katılık ilk başta yorucu görünür ama hataları program çalışmadan yakalar.
Temel tipler
| Tip | Ne saklar? | Tipik boyut |
|---|---|---|
| int | Tam sayı | 4 bayt |
| double | Ondalıklı sayı (hassas) | 8 bayt |
| float | Ondalıklı sayı (daha az hassas) | 4 bayt |
| char | Tek karakter | 1 bayt |
| bool | true ya da false | 1 bayt |
| std::string | Metin | değişken |
Boyutlar platforma göre değişebilir; sizeof(int) ile kendi derleyicinde ölçebilirsin. Gömülü sistemlerde boyutun kesin olması gerekir. O zaman <cstdint> başlığındaki std::uint8_t, std::int16_t, std::uint32_t gibi tipleri kullanırsın.
ADC örneği
Bir mikrodenetleyicinin 10 bitlik ADC'si 0-1023 arası bir sayı okur. Referans gerilimi 3,3 V ise okunan sayıyı gerilime çevirmek için V = okuma * Vref / 1023 formülünü kullanırız.
#include <cstdint>
#include <iomanip>
#include <iostream>
#include <string>
int main() {
const double vref = 3.3;
const int adcMax = 1023;
int okuma = 512;
double gerilim = okuma * vref / adcMax;
std::cout << std::fixed << std::setprecision(3);
std::cout << "ADC: " << okuma << " -> " << gerilim << " V\n";
std::cout << "7 / 2 = " << 7 / 2 << '\n';
std::cout << "7 / 2.0 = " << 7 / 2.0 << '\n';
std::uint8_t sayac = 250;
sayac += 10;
std::cout << "uint8_t: " << static_cast<int>(sayac) << '\n';
std::string kart = "STM32";
auto uzunluk = kart.size();
std::cout << kart << " (" << uzunluk << " karakter)\n";
return 0;
}
ADC: 512 -> 1.652 V
7 / 2 = 3
7 / 2.0 = 3.500
uint8_t: 4
STM32 (5 karakter)
Bu çıktıdan öğrendiklerimiz
const
const ile tanımlanan değer değiştirilemez. Referans gerilimi gibi sabitleri const yapmak hem yanlışlıkla değiştirmeyi önler hem de niyetini belli eder.
Tam sayı bölmesi
7 / 2 sonucu 3'tür, çünkü iki taraf da int olduğunda sonuç da int olur ve kesir atılır. En az bir taraf double ise (örn. 7 / 2.0) sonuç 3.5 çıkar. Ortalama hesaplarken en sık yapılan hata budur.
Taşma (overflow)
std::uint8_t en fazla 255 tutar. 250'ye 10 eklediğimizde sonuç 260 olurdu ama bu tipte 256'ya göre mod alınır ve 4 kalır. İşaretsiz tiplerde bu "sarma" tanımlıdır; işaretli int taşması ise tanımsız davranıştır ve çok tehlikelidir.
auto
auto derleyiciye "tipi sağ taraftan çıkar" der. kart.size() bir std::size_t döndürür; tipin adını ezberlemene gerek kalmaz. Yine de tip önemliyse açıkça yazmak okunurluğu artırır.
Yerel değişkenler kendiliğinden sıfırlanmaz. int x; yazıp doğrudan okursan içinde çöp değer bulursun. Her zaman bir başlangıç değeri ver: int x = 0; ya da int x{0};.
Süslü parantezle ilk değer verirken (int n{3.7};) derleyici ondalık kısmın kaybolacağını fark eder ve hata verir. Bu sayede sessiz veri kayıpları engellenir.
Kendin dene
- 12 bitlik bir ADC için (
maksimum 4095) okuma değeri 2048 ve referans 5 V olsun; gerilimi hesaplayıp yazdır. - İki
intdeğişkenin ortalamasını hesapla. Önce yanlış (tam sayı bölmesiyle), sonra doğru yolla. std::uint8_tdeğişkenine 255 ata, bir ekle ve sonucu yazdır.
// Mini sınav
Bir seçeneğe tıkla; doğru mu yanlış mı, anında ve nedeniyle birlikte göreceksin.
Bitirdiğinde işaretle: ilerlemen kaydolur, +20 XP kazanırsın.
İpucu: ← → tuşlarıyla dersler arasında gezinebilirsin.