_ (Low Line) is ASCII code point 95 (0x5F), Unicode U+005F, and a printable punctuation character. It draws a short horizontal stroke at the baseline — originally a proofreading mark indicating that a word should be underlined, back when underscoring on a typewriter meant typing, backspacing, and striking the key. In code, the underscore is the connector tissue of naming conventions. Snake_case (my_variable_name) dominates Python, Ruby, Rust, and C's standard library. Many languages give it a special semantic role: Python uses _ as a throwaway variable in unpacking and __init__ for dunder methods, while JavaScript recently adopted _ conventions for signaling private intent. SQL treats _ as a single-character wildcard in LIKE patterns, so querying WHERE name LIKE 'a_b' matches "acb" and "a2b" — a behavior developers discover only when their filter returns unexpected rows because they forgot to escape a literal underscore. The character was present on typewriters well before computing, serving purely as the mechanical underline key. UTF-8 encodes it as a single byte 0x5F. Unicode classifies it as Pc (Punctuation, Connector) with the name LOW LINE — the only ASCII character in the Connector subcategory, reflecting its unique role as the punctuation mark languages treat as part of a word rather than a boundary between them.
char key[32] = "user";strcat(key, "_"); // delimiterstrcat(key, "id"); // builds "user_id"
Underscore separates words in identifiers: user_name, MAX_SIZE, get_data(). This convention is called snake_case and dominates Python, Rust, C, and Ruby. It was popular before camelCase because early systems were case-insensitive. Both are equally readable — just be consistent within a project.
Convention varies by language. In Python, _private suggests a private variable (not enforced). __name triggers name mangling. _unused indicates an intentionally unused variable. In JavaScript, _lodash was the lodash library. In Go, _ is the blank identifier (discard a value).
Reading 1000000 is hard. Reading 1_000_000 is easy. Python, Rust, JavaScript, Java, and Swift allow underscores in numeric literals for readability. The compiler ignores them entirely. You can place them anywhere: 0xFF_FF, 3.14_159, 1_00 (though unconventional placements hurt readability).
_ is the wildcard pattern — 'match anything, discard the value.' In pattern matching (Rust, Haskell, Scala), _ matches any variant: match x { 1 => 'one', _ => 'other' }. In Python, _ conventionally stores the last REPL result and serves as a throwaway variable in loops.