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:
| Escape | Makna | Contoh hasil |
|---|---|---|
\n | Baris baru (newline) | Memindahkan kursor ke baris berikutnya |
\t | Tabulasi horizontal | Kolom teks sejajar |
\\ | Backslash | C:\\temp menjadi C:\temp |
\" | Kutip ganda dalam string | Ia berkata: \"hai\" |
\' | Kutip tunggal | Wajib dalam char, opsional dalam string |
\0 | Karakter nul (penanda akhir C-string) | Tidak terlihat, tetapi penting |
\r | Carriage return | Kursor kembali ke awal baris |
\a | Bell (suara bip terminal) | Tidak stabil antar terminal |
\u00A9 | Unicode 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:
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:
#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:
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:
- Baris 7-8 (
\ndan\t): satu string boleh memuat banyak escape;Nama\t: Budimemuat TAB sungguhan antaraNamadan:, persis seperti pada output. - Baris 9 (
\\): setiap\\menghasilkan satu backslash, sehingga path Windows tampil wajar — dan inilah sumber polaC:\\yang sering ditemui di kode nyata. - Baris 12 (
char kutip): escape'\'menyimpan satu karakter kutip tunggal; dicetak ke output tanpa berubah. - Baris 15 (
strlen): string"AB\0CD"berisi karakter nul di tengah. Fungsistrlendari<cstring>menghitung panjang sampai\0, sehingga hasilnya2, bukan5— bukti bahwa\0adalah penanda akhir C-string gaya C. - Baris 18 (raw string): seluruh isi
R"( ... )"dicetak apa adanya;\d,\t, danC:\barutidak diproses sebagai escape. - 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:
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:
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.