వేరియబుల్స్, డేటా టైప్స్ & auto

🌐 Modern C++ (C++20/C++17) 🟢 Chapter 2 of 20 📂 Phase 01: బేసిక్స్ & ఫండమెంటల్స్ 📅 2026 Edition
📌 Covered in this chapter: ప్రిమిటివ్ డేటా టైప్స్ · sizeof ఆపరేటర్ · auto టైప్ ఇన్ఫరెన్స్ · const & constexpr · వేరియబుల్ స్కోప్

కంప్యూటర్ ప్రోగ్రామింగ్‌లో ప్రతి అప్లికేషన్ యొక్క గుండెకాయ డేటా (Data). మీ ఫోన్‌లో గేమింగ్ స్కోర్ అయినా, బ్యాంక్ బ్యాలెన్స్ అయినా, లేదా రాకెట్ స్పీడ్ అయినా — అన్నీ కంప్యూటర్ RAM మెమరీలో చిన్న చిన్న బైట్స్ రూపంలో భద్రపరచబడతాయి. C++ భాష ప్రత్యేకత ఏమిటంటే, ఇది హార్డ్‌వేర్ మెమరీపై మీకు 100% ప్రత్యక్ష నియంత్రణను (Direct Hardware Control) ఇస్తుంది.

ఈ రెండవ అధ్యాయంలో, కంప్యూటర్ సిలికాన్ మెమరీ సెల్స్ ఎలా పనిచేస్తాయి, C++ ప్రిమిటివ్ డేటా టైప్స్ యొక్క బైట్ సైజులు, C++11 లో వచ్చిన అద్భుతమైన auto టైప్ ఇన్ఫరెన్స్, మరియు కంపైల్-టైమ్ పెర్ఫార్మెన్స్ ఇచ్చే constexpr ల గురించి లోతుగా నేర్చుకుందాం!

1 వేరియబుల్ అంటే ఏమిటి? కంప్యూటర్ RAM మెమరీలో అసలు ఏం జరుగుతుంది?

ఒక వేరియబుల్ (Variable) అంటే సరళంగా చెప్పాలంటే "విలువను భద్రపరిచే ఒక మెమరీ పెట్టె (Named Memory Container)". కంప్యూటర్ యొక్క ప్రాథమిక మెమరీ అయిన RAM (Random Access Memory) అనేది బిలియన్ల కొద్దీ 1-బైట్ (8-bits) మెమరీ గదుల సమాహారం. ప్రతి గదికి ఒక ప్రత్యేకమైన హెక్సాడెసిమల్ చిరునామా (Hexadecimal Memory Address, ఉదాహరణకు 0x7ffee4b2a8) ఉంటుంది.

మనం ప్రోగ్రామ్‌లో అలాంటి సంక్లిష్టమైన మెమరీ అడ్రస్‌లను గుర్తుపెట్టుకోవడం అసాధ్యం. అందుకే మనం ఒక మెమరీ లొకేషన్‌కు ఇచ్చే మానవ-అనుకూలమైన పేరునే వేరియబుల్ అంటాము.

🧠 మెమరీ అలొకేషన్ ప్రాసెస్ (When you write: int age = 21;)

  1. కంపైలర్ చెక్: కంపైలర్ int ని చూసి, దీనికి RAM లో వరుసగా 4 బైట్లు (32-బిట్లు) అవసరమని నిర్ణయిస్తుంది.
  2. అడ్రస్ కేటాయింపు: RAM లో ఖాళీగా ఉన్న 4 బైట్ల బ్లాక్‌ను రిజర్వ్ చేస్తుంది (ఉదా: 0x1000 నుండి 0x1003 వరకు).
  3. బైనరీ కన్వర్షన్: 21 అనే సంఖ్యను బైనరీగా (00000000 00000000 00000000 00010101) మార్చి ఆ మెమరీ సెల్స్‌లో నింపుతుంది.
  4. సింబల్ టేబుల్: భవిష్యత్తులో మీరు ఎప్పుడు age అని రాసినా ఆ 4 బైట్ల డేటాను చదవడానికి వీలుగా తన అంతర్గత సింబల్ టేబుల్‌లో నమోదు చేసుకుంటుంది.

2 C++ ఫండమెంటల్ డేటా టైప్స్ వర్గీకరణ (Core Type System)

C++ అనేది Statically Typed లాంగ్వేజ్. అంటే ప్రతి వేరియబుల్ యొక్క డేటా టైప్ కంపైలేషన్ సమయంలోనే స్పష్టంగా తెలిసి ఉండాలి. ఒక వేరియబుల్‌కు ఒక టైప్ ఇచ్చిన తర్వాత దానిలోకి వేరే టైప్ డేటాను బలవంతంగా పెట్టలేము. C++ డేటా టైప్స్ ప్రధానంగా మూడు వర్గాలుగా విభజించబడ్డాయి:

1. Primitive / Fundamental

భాషతో పాటే అంతర్నిర్మితంగా వచ్చే ప్రాథమిక టైప్స్: పూర్ణాంకాలు (int, short, long), ఫ్లోట్స్ (float, double), అక్షరాలు (char), మరియు బూలియన్లు (bool).

2. Derived Data Types

ప్రాథమిక టైపుల ఆధారంగా నిర్మించబడినవి: అర్రేలు (int arr[]), పాయింటర్లు (int* ptr), రిఫరెన్సులు (int& ref), మరియు ఫంక్షన్లు.

3. User-Defined Types

డెవలపర్లు తమ ప్రాజెక్ట్ అవసరాల కోసం సృష్టించుకునే కస్టమ్ టైప్స్: క్లాసెస్ (class), స్ట్రక్చర్స్ (struct), యూనియన్లు (union), మరియు ఎన్యూమరేషన్లు (enum class).

3 పూర్ణాంకాలు (Integers): short, int, long, long long & Signed vs Unsigned

పూర్ణాంకాలు అంటే దశాంశాలు (Decimals) లేని సంఖ్యలు. వివిధ సైజుల సంఖ్యలను భద్రపరచడానికి C++ నాలుగు ప్రధాన పూర్ణాంక రకాలను అందిస్తుంది:

డేటా టైప్ పరిమాణం (RAM) Signed పరిధి (Range) Unsigned పరిధి (Range)
short (short int) 2 Bytes (16-bits) -32,768 నుండి +32,767 0 నుండి 65,535
int 4 Bytes (32-bits) -2.14 బిలియన్ల నుండి +2.14 బిలియన్లు 0 నుండి 4.29 బిలియన్లు
long 4 లేదా 8 Bytes (OS బట్టి) కనీసం 32-bits పరిధి కనీసం 0 to 4.29 బిలియన్లు
long long 8 Bytes (64-bits) -9 క్వింటిలియన్ల నుండి +9 క్వింటిలియన్లు 0 నుండి 18.44 క్వింటిలియన్లు

⚖️ Signed vs Unsigned అంటే ఏమిటి?

డిఫాల్ట్‌గా అన్ని పూర్ణాంకాలు Signed (ధనాత్మక + మరియు రణాత్మక - సంఖ్యలను నిల్వ చేస్తాయి). మొదటి బిట్ (Most Significant Bit - MSB) గుర్తు కోసం కేటాయించబడుతుంది. మీరు ఒకవేళ unsigned int అని వాడితే, నెగటివ్ సంఖ్యలకు అవకాశం ఉండదు; ఆ బిట్ కూడా సంఖ్య పరిమాణానికే ఉపయోగపడటం వల్ల గరిష్ట పాజిటివ్ రేంజ్ రెట్టింపు అవుతుంది (0 to 4.29 Billion)!

🛡️ మోడరన్ C++ ఫిక్స్‌డ్-విడ్త్ ఇంటిజర్స్ (<cstdint>)

సాంప్రదాయ int లేదా long సైజులు వేర్వేరు ఆపరేటింగ్ సిస్టమ్‌లలో (Windows vs Linux 64-bit) మారే అవకాశం ఉంది. అందుకే నెట్‌వర్కింగ్, గేమింగ్ ఇంజిన్లు మరియు ఫైల్ ఫార్మాట్స్ లో ఖచ్చితమైన బిట్ సైజు ఉండే Fixed-Width Integers (C++11) వాడతారు:

  • std::int8_t / std::uint8_t: ఖచ్చితంగా 1 Byte (8-bits). బైట్ స్ట్రీమ్స్ కోసం వాడుతారు.
  • std::int16_t / std::uint16_t: ఖచ్చితంగా 2 Bytes (16-bits). ఆడియో శాంపిల్స్ కోసం.
  • std::int32_t / std::uint32_t: ఏ OS లో అయినా ఖచ్చితంగా 4 Bytes (32-bits). 3D గ్రాఫిక్స్ కోఆర్డినేట్స్.
  • std::int64_t / std::uint64_t: ఏ కంప్యూటర్‌లో అయినా గ్యారెంటీగా 8 Bytes (64-bits). మైక్రోసెకండ్ టైమ్‌స్టాంప్స్ & ఫైనాన్షియల్ లెడ్జర్స్.

4 ఫ్లోటింగ్ పాయింట్ సంఖ్యలు: float, double, long double & IEEE-754

దశాంశ బిందువులు (డెసిమల్స్) ఉండే సైంటిఫిక్ గణనలు మరియు కరెన్సీ కాలిక్యులేషన్ల కోసం C++ మూడు రకాల ఫ్లోటింగ్-పాయింట్ రకాలను అందిస్తుంది:

  • float (Single Precision - 4 Bytes): సుమారు 7 డెసిమల్ అంకెల కచ్చితత్వాన్ని (Precision) ఇస్తుంది. సంఖ్య చివర f అక్షరం పెట్టాలి (ఉదా: 3.14159f).
  • double (Double Precision - 8 Bytes): సుమారు 15 నుండి 17 డెసిమల్ అంకెల అద్భుతమైన కచ్చితత్వాన్ని ఇస్తుంది. ఆధునిక CPU లలో ఇది డిఫాల్ట్ మరియు అత్యంత వేగవంతమైన ఛాయిస్!
  • long double (Extended Precision - 8, 12, లేదా 16 Bytes): అంతరిక్ష శాస్త్రం మరియు క్వాంటం ఫిజిక్స్ పరిశోధనల్లో అత్యున్నత కచ్చితత్వం కోసం వాడతారు.
💻 Example 1: Floating Point Precision Demo
C++17
#include <iostream>
#include <iomanip> // std::setprecision కోసం

int main() {
    float fVal = 1.0f / 3.0f;
    double dVal = 1.0 / 3.0;

    std::cout << std::setprecision(18); // 18 స్థానాల వరకు ప్రింట్ చేయడం
    std::cout << "Float Precision (7 digits):   " << fVal << '\n';
    std::cout << "Double Precision (16 digits):  " << dVal << '\n';

    return 0;
}

5 అక్షరాలు & బూలియన్లు: char, bool, ASCII & Modern char8_t

టెక్స్ట్ మరియు బూలియన్ ట్రూత్ వాల్యూస్ కంప్యూటర్ మెమరీలో ఎలా భద్రపరచబడతాయి?

  • char (1 Byte / 8-bits): సింగిల్ క్యారెక్టర్‌ను నిల్వ చేస్తుంది. అంతర్గతంగా ఇది ఒక చిన్న ఇంటిజర్ (ASCII కోడ్). ఉదాహరణకు char ch = 'A'; అని రాస్తే మెమరీలో 65 అనే బైనరీ విలువ సేవ్ అవుతుంది!
  • bool (1 Byte): కేవలం true (1) లేదా false (0) లను మాత్రమే నిల్వ చేస్తుంది. వాస్తవానికి 1 బిట్ సరిపోయినప్పటికీ, CPU మెమరీ అడ్రసింగ్ సులభతరం కోసం 1 పూర్తి బైట్ కేటాయించబడుతుంది.
  • char8_t (C++20), char16_t, wchar_t: ప్రపంచంలోని వివిధ భాషల యూనికోడ్ (UTF-8, UTF-16, తెలుగు ఫాంట్స్) ప్రాసెస్ చేయడానికి మోడరన్ C++ లో చేర్చబడ్డాయి.

6 sizeof ఆపరేటర్ & <limits> హెడర్ ఫైల్ (Memory & Ranges)

మీ కంప్యూటర్ ఆర్కిటెక్చర్‌లో ఏ డేటా టైప్ ఎంత స్థలాన్ని తీసుకుంటుందో తెలుసుకోవడానికి sizeof ఆపరేటర్ ఉపయోగపడుతుంది. అలాగే <limits> హెడర్ ద్వారా ఏ టైప్ గరిష్టంగా ఎంత సంఖ్యను నిల్వ చేయగలదో తెలుసుకోవచ్చు:

💻 Example 2: sizeof & numeric_limits Inspection
C++17
#include <iostream>
#include <limits>

int main() {
    std::cout << "--- C++ టైప్ మెమరీ సైజులు & పరిధులు ---\n";
    std::cout << "int సైజు: " << sizeof(int) << " Bytes | Min: " 
              << std::numeric_limits<int>::min() << " | Max: " 
              << std::numeric_limits<int>::max() << '\n';

    std::cout << "double సైజు: " << sizeof(double) << " Bytes | Max: " 
              << std::numeric_limits<double>::max() << '\n';

    std::cout << "char సైజు: " << sizeof(char) << " Byte\n";
    std::cout << "bool సైజు: " << sizeof(bool) << " Byte\n";

    return 0;
}

7 వేరియబుల్ ఇనిషియలైజేషన్: C-Style vs Modern C++11 Uniform Initialization ({})

C++ లో వేరియబుల్స్‌ను ప్రారంభించడానికి (Initialize) 3 మార్గాలు ఉన్నాయి:

  1. int a = 10; (C-Style Copy Initialization)
  2. int b(20); (Direct Constructor Initialization)
  3. int c{30}; (Modern C++11 Uniform / Brace Initialization) — 🌟 ప్రొఫెషనల్ గోల్డ్ స్టాండర్డ్!

🛡️ Brace Initialization ({}) ఎందుకు అత్యంత సురక్షితమైనది?

పాత పద్ధతిలో int x = 7.9; అని రాస్తే కంపైలర్ సైలెంట్‌గా దశాంశాన్ని కట్ చేసి 7 గా మార్చేస్తుంది (Narrowing Conversion బగ్). కానీ మీరు int x{7.9}; అని కర్లీ బ్రేసెస్‌తో రాస్తే, కంపైలర్ వెంటనే "error: narrowing conversion of 7.9 from double to int" అని ఎర్రర్ ఇచ్చి ప్రమాదాన్ని నివారిస్తుంది!

8 auto కీవర్డ్: Modern C++ టైప్ ఇన్ఫరెన్స్ (Type Inference)

C++11 లో ప్రవేశపెట్టబడిన అత్యంత శక్తివంతమైన ఆధునిక ఫీచర్ auto కీవర్డ్. వేరియబుల్‌కు మీరు కేటాయించే ప్రారంభ విలువను బట్టి కంపైలర్ స్వయంగా సరైన డేటా టైప్‌ను కంపైల్ సమయంలోనే నిర్ణయిస్తుంది (Automatic Type Deduction).

💻 Example 3: auto Type Deduction in Action
C++17
#include <iostream>
#include <typeinfo>

int main() {
    auto age = 25;           // కంపైలర్ ఆటోమేటిక్‌గా 'int' గా గుర్తిస్తుంది
    auto price = 99.50;      // కంపైలర్ 'double' గా గుర్తిస్తుంది
    auto currency = '₹';     // 'char'
    auto isOnline = true;    // 'bool'

    std::cout << "Age: " << age << " (Bytes: " << sizeof(age) << ")\n";
    std::cout << "Price: " << price << " (Bytes: " << sizeof(price) << ")\n";

    return 0;
}

ముఖ్య గమనిక: auto వాడినప్పుడు పర్ఫార్మెన్స్ ఒక్క శాతం కూడా తగ్గదు! ఎందుకంటే టైప్ నిర్ణయించే పని కంపైలర్ చేస్తుంది, రన్‌టైమ్ కాదు.

9 const vs constexpr vs consteval: కంపైల్-టైమ్ కాన్స్టాంట్స్

ప్రోగ్రామ్‌లో మారకూడని విలువలను స్థిరంగా ఉంచడానికి (Constants) C++ లో మూడు స్థాయిల రక్షణ ఉంది:

1. const (రన్‌టైమ్ లేదా కంపైల్-టైమ్ రీడ్-ఓన్లీ):

ఒకసారి విలువ అసైన్ చేసిన తర్వాత ఇక మార్చలేము. ఇది రన్‌టైమ్‌లో యూజర్ ఇచ్చే ఇన్‌పుట్‌ను కూడా రీడ్-ఓన్లీగా లాక్ చేయగలదు.

2. constexpr (కచ్చితమైన కంపైల్-టైమ్ కాన్స్టాంట్):

ఈ విలువ కంపైలేషన్ సమయంలోనే ఖరారు కావాలి. దీనివల్ల రన్‌టైమ్‌లో ఎటువంటి ప్రాసెసింగ్ సమయం వృధా కాదు (Zero Runtime Overhead). ఉదాహరణకు: constexpr double PI = 3.1415926535;

3. consteval (Immediate Function - C++20):

ఫంక్షన్ కచ్చితంగా కంపైల్-టైమ్ లోనే ఎగ్జిక్యూట్ అవ్వాలని ఆదేశిస్తుంది. రన్‌టైమ్‌లో ఇది అసలు ఉండదు, ఫలితం మాత్రమే డైరెక్ట్ గా కోడ్‌లో కూర్చుంటుంది!

10 వేరియబుల్ స్కోప్ & లైఫ్‌టైమ్ (Scope, Lifetime & Shadowing)

ఒక వేరియబుల్ ప్రోగ్రామ్‌లో ఎక్కడెక్కడ అందుబాటులో ఉంటుంది (Scope) మరియు ఎంతసేపు RAM మెమరీలో జీవించి ఉంటుంది (Lifetime)?

  • Local Scope (బ్లాక్ స్కోప్): ఒక ఫంక్షన్ లేదా { ... } కర్లీ బ్రాకెట్ల లోపల డిక్లేర్ చేసిన వేరియబుల్స్ ఆ బ్లాక్ ముగియగానే మెమరీ నుండి ఆటోమేటిక్‌గా నశించిపోతాయి (Stack Memory Cleanup).
  • Global Scope: అన్ని ఫంక్షన్ల కంటే పైన బయట డిక్లేర్ చేసిన వేరియబుల్స్ ప్రోగ్రామ్ ముగిసేవరకు జీవించి ఉంటాయి.
  • Variable Shadowing: గ్లోబల్ వేరియబుల్ పేరుతోనే లోకల్ వేరియబుల్ సృష్టిస్తే, లోకల్ వేరియబుల్ గ్లోబల్ దాన్ని దాచిపెడుతుంది. గ్లోబల్ వేరియబుల్‌ను తిరిగి యాక్సెస్ చేయడానికి Scope Resolution Operator (::) వాడాలి.
💻 Example 4: Scope Resolution Operator (::) Demo
C++17
#include <iostream>

int globalTaxRate = 18; // గ్లోబల్ వేరియబుల్

int main() {
    int globalTaxRate = 5; // లోకల్ వేరియబుల్ (Shadows the global one)

    std::cout << "లోకల్ టాక్స్ రేట్: " << globalTaxRate << "%\n";
    std::cout << "గ్లోబల్ టాక్స్ రేట్ (:: తో): " << ::globalTaxRate << "%\n";

    return 0;
}

11 టైప్ కాస్టింగ్ మెకానిక్స్: Implicit Coercion vs Modern static_cast

ఒక డేటా టైప్‌ను మరొక డేటా టైప్‌గా మార్చడాన్ని Type Casting అంటారు. C++ లో పాత C-Style కాస్టింగ్ ((int)3.14) వాడటం నిషేధం. ఎందుకంటే అది టైప్ సేఫ్టీని విస్మరించి ప్రమాదకరమైన మెమరీ బగ్స్ తెస్తుంది. ఆధునిక C++ లో స్పష్టమైన static_cast<T>() వాడాలి!

💻 Example 5: Integer Division Bug & static_cast Solution
C++17
#include <iostream>

int main() {
    int totalMarks = 475;
    int maxMarks = 500;

    // ❌ ప్రమాదం: రెండు పూర్ణాంకాల భాగహారం ఎల్లప్పుడూ పూర్ణాంకమే (0 అవుతుంది!)
    double wrongPercentage = totalMarks / maxMarks * 100;

    // ✅ సరైన ఆధునిక C++ పరిష్కారం: static_cast తో కన్వర్ట్ చేయడం
    double correctPercentage = static_cast<double>(totalMarks) / maxMarks * 100.0;

    std::cout << "తప్పుడు పద్ధతి పర్సంటేజ్ : " << wrongPercentage << "%\n";
    std::cout << "static_cast తో కచ్చితమైన ఫలితం: " << correctPercentage << "%\n";

    return 0;
}

12 సాధారణ బిగినర్ తప్పులు, అన్‌ఇనిషియలైజ్డ్ గార్బేజ్ & Overflow Bugs

❌ Trap 1: వేరియబుల్‌ను ఇనిషియలైజ్ చేయకుండా వాడటం (Garbage Value Trap)

Java లేదా C# లాగా C++ వేరియబుల్స్‌ను ఆటోమేటిక్‌గా జీరో (0) చేయదు! మీరు int count; అని రాసి నేరుగా ప్రింట్ చేస్తే, ఆ RAM మెమరీ స్లాట్‌లో గతంలో ఏ యాప్ వాడి వదిలేసిన చెత్త (Garbage Value, ఉదా: -858993460) ఉంటుందో అదే వస్తుంది. ఎల్లప్పుడూ int count{0}; వాడండి.

❌ Trap 2: పూర్ణాంక ఓవర్‌ఫ్లో (Integer Overflow)

ఒక 32-బిట్ int గరిష్ట పరిధి సుమారు 2.14 బిలియన్లు. మీరు దానికి 1 కలిపితే అది పాజిటివ్ కాస్తా సడన్‌గా నెగటివ్‌గా (-2147483648) మారిపోతుంది! పెద్ద మొత్తాల కోసం ఎల్లప్పుడూ long long వాడాలి.

13 రియల్-వరల్డ్ ప్రాక్టీస్ ప్రాజెక్ట్: "Enterprise Employee Payroll Engine"

ఈ అధ్యాయంలో మనం నేర్చుకున్న auto, constexpr, sizeof, static_cast మరియు బ్రేస్ ఇనిషియలైజేషన్ అన్నింటినీ ఉపయోగించి ఒక నిజమైన "Enterprise Employee Payroll & Tax Architecture Engine" ను నిర్మిద్దాం:

💻 Complete Masterclass Practice Project: Payroll Engine
C++17 / C++20 Complete Project
#include <iostream>
#include <string>
#include <iomanip>

int main() {
    // 1. కంపైల్-టైమ్ కాన్స్టాంట్స్ (constexpr)
    constexpr double PF_PERCENT{12.0};       // ప్రావిడెంట్ ఫండ్ 12%
    constexpr double PROFESSIONAL_TAX{200.0}; // ప్రొఫెషనల్ టాక్స్ ₹200
    constexpr double HEALTH_INSURANCE{1500.0};

    // 2. ఎంప్లాయ్ డేటా (Modern Brace Initialization & auto)
    const std::string empName{"శ్రీకాంత్ వర్మ (Srikanth Varma)"};
    const long long empId{9804218765LL}; // 64-bit integer
    double basicSalary{85000.00};
    double performanceBonus{12500.50};
    char performanceGrade{'A'};
    bool isEligibleForIncrement{true};

    // 3. శాలరీ కాలిక్యులేషన్స్
    auto grossSalary = basicSalary + performanceBonus;
    auto pfDeduction = grossSalary * (PF_PERCENT / 100.0);
    auto totalDeductions = pfDeduction + PROFESSIONAL_TAX + HEALTH_INSURANCE;
    auto netInHandSalary = grossSalary - totalDeductions;

    // 4. అందమైన పేస్లిప్ జనరేషన్
    std::cout << std::fixed << std::setprecision(2);
    std::cout << "=================================================\n";
    std::cout << "       🏢 OUR COMPILER ENTERPRISE PAYROLL        \n";
    std::cout << "=================================================\n";
    std::cout << "ఉద్యోగి పేరు       : " << empName << '\n';
    std::cout << "ఎంప్లాయ్ ఐడీ       : " << empId << " (64-bit Size: " << sizeof(empId) << "B)\n";
    std::cout << "పెర్ఫార్మెన్స్ గ్రేడ్: " << performanceGrade << '\n';
    std::cout << "ఇంక్రిమెంట్ అర్హత  : " << (isEligibleForIncrement ? "అవును (Eligible)" : "కాదు") << '\n';
    std::cout << "-------------------------------------------------\n";
    std::cout << "బేసిక్ శాలరీ       : ₹ " << basicSalary << '\n';
    std::cout << "పెర్ఫార్మెన్స్ బోనస్: ₹ " << performanceBonus << '\n';
    std::cout << "గ్రాస్ జీతం (Gross) : ₹ " << grossSalary << '\n';
    std::cout << "-------------------------------------------------\n";
    std::cout << "PF కటింగ్ (12%)    : -₹ " << pfDeduction << '\n';
    std::cout << "హెల్త్ ఇన్సూరెన్స్ : -₹ " << HEALTH_INSURANCE << '\n';
    std::cout << "ప్రొఫెషనల్ టాక్స్  : -₹ " << PROFESSIONAL_TAX << '\n';
    std::cout << "మొత్తం తగ్గింపులు  : -₹ " << totalDeductions << '\n';
    std::cout << "=================================================\n";
    std::cout << "నెట్ టేక్-హోమ్ శాలరీ: ₹ " << netInHandSalary << " /-\n";
    std::cout << "=================================================\n";

    return 0;
}

❓ ఇంటర్వ్యూ & పరీక్షల క్విజ్ (Knowledge Check)

ప్రశ్న 1: C++ లో Modern Brace Initialization (int x{5};) ఎందుకు రికమండ్ చేస్తారు?
సమాధానం: కర్లీ బ్రేసెస్ {} తో ఇనిషియలైజ్ చేస్తే కంపైలర్ ప్రమాదకరమైన Narrowing Conversions (ఉదాహరణకు double నుండి int కి సమాచారం కోల్పోవడం) జరగకుండా కంపైల్-టైమ్ లోనే ఎర్రర్ ఇస్తుంది.
ప్రశ్న 2: const మరియు constexpr మధ్య ప్రధాన వ్యత్యాసం ఏమిటి?
సమాధానం: const అనేది కేవలం వేరియబుల్‌ను రీడ్-ఓన్లీగా మారుస్తుంది (ఇది రన్‌టైమ్‌లో కూడా లెక్కించబడవచ్చు). కానీ constexpr అనేది కచ్చితంగా కంపైలేషన్ సమయంలోనే గణించబడే గ్యారెంటీని ఇస్తుంది; దీనివల్ల రన్‌టైమ్ మెమరీ మరియు ప్రాసెసింగ్ కాస్ట్ జీరో అవుతుంది.
ప్రశ్న 3: auto కీవర్డ్ వాడటం వల్ల C++ ప్రోగ్రామ్ స్పీడ్ తగ్గుతుందా?
సమాధానం: అస్సలు తగ్గదు! ఎందుకంటే auto అనేది కంపైల్-టైమ్ లో మాత్రమే కంపైలర్ చేత టైప్ డిడక్షన్ చేయబడుతుంది. రన్‌టైమ్‌లో ఇది స్పష్టంగా రాసిన సాధారణ డేటా టైప్ లాగానే నేరుగా మెషిన్ కోడ్‌గా రన్ అవుతుంది.
ప్రశ్న 4: float కి బదులుగా double ని ఎందుకు ప్రాధాన్యతగా వాడాలి?
సమాధానం: float కేవలం 7 దశాంశ అంకెల కచ్చితత్వాన్ని ఇస్తుంది (రౌండింగ్ ఎర్రర్స్ వచ్చే అవకాశం ఎక్కువ). double 15 నుండి 17 అంకెల కచ్చితత్వాన్ని ఇస్తుంది. అంతేకాకుండా ఆధునిక 64-బిట్ CPU లు double ని నేరుగా హార్డ్‌వేర్ రిజిస్టర్లలో మెరుపువేగంతో ప్రాసెస్ చేస్తాయి.
ప్రశ్న 5: C++ లో పాత C-Style (int)a కి బదులుగా static_cast<int>(a) ఎందుకు వాడాలి?
సమాధానం: C-Style కాస్ట్ చాలా బలవంతపు టైప్ కన్వర్షన్ చేస్తుంది (ప్రమాదకరమైన పాయింటర్ కన్వర్షన్లను కూడా ఆపదు). కానీ static_cast<T>() టైప్-సేఫ్టీ చెక్ చేస్తుంది; చట్టవిరుద్ధమైన లేదా అర్థంలేని కన్వర్షన్లు జరిగితే కంపైలర్ ఎర్రర్ ఇచ్చి ఆపుతుంది.
← Prev: 1. C++ పరిచయం & Hello World Next: 3. ఇన్‌పుట్ & అవుట్‌పుట్ (cin, cout) →
OC
Written by Our Compiler Technical Editorial Team
Reviewed for accuracy & tested on GCC 13 / Clang 17 (C++20 Standard) · 2026 Academic Edition

ఈ ప్రాజెక్ట్‌ను లైవ్‌గా మన కంపైలర్‌లో రన్ చేయండి!

ఎటువంటి లోకల్ సెటప్ లేకుండా, బ్రౌజర్‌లోనే నేరుగా Modern C++ (GCC 13 / C++20) కంపైలర్‌లో ఈ కోడ్‌ను ఎగ్జిక్యూట్ చేసి రన్‌టైమ్ అవుట్‌పుట్‌ను తనిఖీ చేయండి.