Beberapa karakter tidak mungkin diketik langsung di dalam kode: bagaimana menulis tanda kutip di dalam string yang justru dibuka dengan tanda kutip, atau memasukkan baris baru yang tidak boleh memutus baris source code? C++ menjawabnya dengan escape sequence: dua karakter yang diawali backslash (\) dan dibaca compiler sebagai SATU karakter khusus. Urutan \n yang selama ini kita pakai di setiap std::cout adalah contohnya. Pada Chapter ini kita menginventarisasi escape sequence utama, melihat perilaku yang berbeda dalam char versus string, dan mengenal raw string literal yang mematikan semua escape sekaligus.

Apa Itu Escape Sequence #

Escape sequence adalah pasangan backslash dan satu karakter (atau beberapa karakter untuk bentuk unicode) yang diterjemahkan compiler menjadi satu karakter dengan makna khusus. Kata “escape” di sini berarti karakter pengikutinya lolos dari makna biasanya: \n bukan huruf n, melainkan karakter baris baru; \" bukan akhir string, melainkan tanda kutip itu sendiri. Mekanisme ini bekerja pada saat kompilasi, bukan saat program berjalan — string "C:\\temp" sudah tersimpan di executable sebagai C:\temp sebelum program sempat dieksekusi. Karena backslash punya peran khusus ini, backslash itu sendiri juga harus di-escape: \\ menghasilkan satu backslash sungguhan.

Tabel Escape Sequence Utama #

Tabel berikut merangkum escape sequence yang paling sering dibutuhkan dalam pekerjaan sehari-hari:

EscapeMaknaContoh hasil
\nBaris baru (newline)Memindahkan kursor ke baris berikutnya
\tTabulasi horizontalKolom teks sejajar
\\BackslashC:\\temp menjadi C:\temp
\"Kutip ganda dalam stringIa berkata: \"hai\"
\'Kutip tunggalWajib dalam char, opsional dalam string
\0Karakter nul (penanda akhir C-string)Tidak terlihat, tetapi penting
\rCarriage returnKursor kembali ke awal baris
\aBell (suara bip terminal)Tidak stabil antar terminal
\u00A9Unicode escape (4 digit heksadesimal)Simbol ©

Dua entri terakhir perlu catatan: \a dan \r kita kenali bentuknya tetapi sengaja TIDAK kita sertakan dalam output yang diverifikasi — alasannya dijelaskan di bagian bawah. Bentuk unicode lain juga tersedia, misalnya \u00E9 untuk é dan \U0001F600 untuk emoji dengan 8 digit.

Escape dalam char versus string #

Aturan kecil yang sering membingungkan: kutip tunggal WAJIB di-escape di dalam char, tetapi boleh tanpa escape di dalam string; sebaliknya kutip ganda wajib di-escape di dalam string, tetapi tanpa masalah di dalam char:

cpp
char k1 = '\'';      // wajib: '\'' — kutip tunggal di dalam char
char k2 = '"';       // aman: kutip ganda boleh langsung dalam char
std::string s1 = "Ia bilang \"hai\"";   // wajib: \" di dalam string
std::string s2 = "kutip tunggal 'A' aman"; // aman: ' boleh langsung

Logikanya konsisten: escape diperlukan hanya bila karakter itu sendiri adalah pembatas konteks tempat ia berada. Kompiler tidak peduli mana yang “lebih cantik” — yang penting string tidak terpotong di tengah dan char tetap berisi satu karakter.

Contoh Teruji: Satu Program, Banyak Escape #

Program berikut memakai escape sequence utama dan sudah diuji dari kompilasi sampai eksekusi. Perhatikan bahwa dua baris output memuat karakter TAB sungguhan:

cpp
#include <iostream>
#include <cstring>

int main() {
    std::cout << "Baris satu\nBaris dua\n";               // \n : baris baru
    std::cout << "Nama\t: Budi\nUmur\t: 21\n";            // \t : tabulasi
    std::cout << "Folder: C:\\Users\\budi\\docs\n";       // \\ : backslash
    std::cout << "Ia berkata: \"C++ seru!\"\n";           // \" : kutip ganda
    std::cout << "Nilai \'A\' adalah terbaik\n";          // \' : kutip tunggal

    char kutip = '\'';    // dalam char, kutip tunggal wajib di-escape
    std::cout << "Char kutip: " << kutip << "\n";

    // \0 menandai akhir C-string: strlen berhenti tepat di situ
    std::cout << "strlen(\"AB\\0CD\") = " << std::strlen("AB\0CD") << "\n";

    // Raw string literal: escape sequence tidak diproses sama sekali
    std::cout << R"(Regex: \d+\t | Folder C:\baru)" << "\n";

    // \u00A9 : unicode escape untuk simbol (c)
    std::cout << "Simbol hak cipta: \u00A9\n";
    return 0;
}

Output yang Dihasilkan:

text
Baris satu
Baris dua
Nama	: Budi
Umur	: 21
Folder: C:\Users\budi\docs
Ia berkata: "C++ seru!"
Nilai 'A' adalah terbaik
Char kutip: '
strlen("AB\0CD") = 2
Regex: \d+\t | Folder C:\baru
Simbol hak cipta: ©

Yang menarik untuk diperhatikan:

  1. Baris 7-8 (\n dan \t): satu string boleh memuat banyak escape; Nama\t: Budi memuat TAB sungguhan antara Nama dan :, persis seperti pada output.
  2. Baris 9 (\\): setiap \\ menghasilkan satu backslash, sehingga path Windows tampil wajar — dan inilah sumber pola C:\\ yang sering ditemui di kode nyata.
  3. Baris 12 (char kutip): escape '\' menyimpan satu karakter kutip tunggal; dicetak ke output tanpa berubah.
  4. Baris 15 (strlen): string "AB\0CD" berisi karakter nul di tengah. Fungsi strlen dari <cstring> menghitung panjang sampai \0, sehingga hasilnya 2, bukan 5 — bukti bahwa \0 adalah penanda akhir C-string gaya C.
  5. Baris 18 (raw string): seluruh isi R"( ... )" dicetak apa adanya; \d, \t, dan C:\baru tidak diproses sebagai escape.
  6. Baris 21 (\u00A9): compiler menerjemahkan unicode escape menjadi byte UTF-8 simbol ©.

\r dan \a: Kenali, Jangan Diverifikasi #

Dua escape ini sengaja tidak dimasukkan ke output program yang diuji. \r (carriage return) memindahkan kursor kembali ke kolom pertama pada baris yang SAMA, tanpa pindah baris:

cpp
std::cout << "1234567890\rABC";
// \r mengembalikan kursor ke kolom 0, lalu "ABC" menimpa "123".
// Di terminal interaktif tampil: ABC4567890

Tampilan ABC4567890 adalah hasil kerja TERMINAL yang menafsirkan \r. Byte yang benar-benar dikirim program tetap 1234567890\rABC — bila output diarahkan ke file, file berisi kedua potongan mentah itu. Inilah contoh nyata perbedaan “apa yang dikirim program” dan “apa yang tampak di layar”.

\a (bell) meminta terminal membunyikan suara bip. Efeknya bergantung terminal, konfigurasi suara, dan lingkungan (sering kali malah sunyi), sehingga tidak bisa diandalkan untuk verifikasi output — cukup kenali bentuknya bila menemui kode lama yang memakainya.

Raw String Literal: Mematikan Semua Escape #

Ketika string berisi banyak backslash — regular expression, path Windows, kode HTML — menulis \\ di mana-mana melelahkan dan rawan salah ketik. C++ menyediakan raw string literal: string yang diawali R"( dan diakhiri )", di dalamnya TIDAK ADA escape yang diproses:

cpp
std::string pola  = R"(\d{3}-\d{4})";        // tanpa raw: "\\d{3}-\\d{4}"
std::string path  = R"(C:\Users\budi\docs)"; // tanpa raw: "C:\\Users\\..."
std::string regex = R"(Regex: \d+\t)";       // \t tetap dua karakter, bukan TAB

Perbandingan pada komentar di atas menunjukkan penghematannya: setiap \ tidak perlu digandakan. Raw string literal juga mengizinkan baris baru di dalamnya, sehingga cocok untuk blok teks multi-baris. Bentuk lanjutannya (delimiter kustom R"del(...)del") berguna bila isi string memuat urutan )" — detailnya dibahas pada Section Array dan String di pembahasan string literal cppreference . Daftar lengkap escape sequence resmi tersedia di halaman escape sequences .

Escape sequences menuntaskan kosakata penulisan string kita. Sekarang semua bahan sudah terkumpul untuk menulis, mengompilasi, dan menjalankan program utuh pertama yang menyapa penggunanya — lengkap dengan cara membaca pesan error ketika ada yang keliru. Itulah agenda Chapter penutup section ini.