<< "Hello" << " " << "world!" << endl; User-defined operators A language may contain a fixed number of built-in operators (e.g. , etc. in C and C++, PHP), or it may allow the creation of programmer-defined operators (e.g. Prolog, Seed7, F#, OCaml, Haskell). Some programming languages restrict operator symbols to special characters like or while others allow also names like div (e.g. Pascal). Most languages have a built-in set of operators, but do not allow user-defined operators, as this significantly complicates parsing. Many languages only allow operators to be used for built-in types, but others allow existing operators to be used for user-defined types; this is known as operator overloading. Some languages allow new operators to be defined, however, either at compile time or at run time. This may involve meta-programming (specifying the operators in a separate language), or within the language itself. Definition of new operators, particularly runtime definition, often makes correct static analysis of programs impossible, since the syntax of the language may be Turing-complete, so even constructing the syntax tree may require solving the halting problem, which is impossible. This occurs for Perl, for example, and some dialects of Lisp. Examples Common examples that differ syntactically are mathematical arithmetic operations, e.g. ">" for "greater than", with names often outside the language's set of identifiers for functions, and called with a syntax different from the language's syntax for calling functions. As a function, "greater than" would generally be named by an identifier, such as gt or greater_than and called as a function, as gt(x, y). Instead, the operation uses the special character > (which is tokenized separately during lexical analysis), and infix notation, as x > y. Common examples that differ semantically (by argument passing mode) are boolean operations, which frequently feature short-circuit evaluation: e.g. a short-circuiting conjunction (X AND Y) that only evaluates later arguments if earlier ones are not false, in a language with strict call-by-value functions. This behaves instead similarly to if/then/else. Less common operators include: Comma operator: e, f Dereference operator: *p and address-of operator: &x ?: or ternary operator: number = spell_out_numbers ? "forty-two" : 42 Elvis operator: x ?: y Null coalescing operator: x ?? y Spaceship operator (for three-way comparison): x <=> y Compilation A compiler can implement operators and functions with subroutine calls or with inline code. Some built-in operators supported by a language have a direct mapping to