1 1.13 rillig /* $NetBSD: lsym_unary_op.c,v 1.13 2023/10/22 21:03:08 rillig Exp $ */ 2 1.1 rillig 3 1.1 rillig /* 4 1.1 rillig * Tests for the token lsym_unary_op, which represents a unary operator. 5 1.1 rillig * 6 1.1 rillig * In an expression, a unary operator is written without blank next to its 7 1.1 rillig * argument. 8 1.1 rillig * 9 1.1 rillig * In a type name, the "unary operator" '*' represents the derivation of a 10 1.1 rillig * pointer type. 11 1.6 rillig * 12 1.6 rillig * See also: 13 1.6 rillig * lsym_binary_op.c 14 1.6 rillig * lsym_postfix_op.c 15 1.6 rillig * C11 6.4.6 "Punctuators" 16 1.6 rillig * C11 6.5 "Expressions" 17 1.1 rillig */ 18 1.1 rillig 19 1.4 rillig //indent input 20 1.3 rillig void 21 1.3 rillig unary_operators(void) 22 1.3 rillig { 23 1.3 rillig /* In the order of appearance in C11 6.5. */ 24 1.3 rillig function(a++, a--, ++a, --a, &a, *a, +a, -a, ~a, !a); 25 1.3 rillig } 26 1.4 rillig //indent end 27 1.1 rillig 28 1.4 rillig //indent run-equals-input 29 1.5 rillig 30 1.5 rillig 31 1.5 rillig /* 32 1.5 rillig * The unary operators '+' and '-' can occur in long chains. In these chains, 33 1.5 rillig * adjacent '+' must not be merged to '++' since that would be a different 34 1.5 rillig * token. The same applies to '&', but that case is irrelevant in practice 35 1.5 rillig * since the address of an address cannot be taken. 36 1.5 rillig */ 37 1.5 rillig //indent input 38 1.5 rillig int var=+3; 39 1.5 rillig int mixed=+-+-+-+-+-+-+-+-+-+-+-+-+-3; 40 1.5 rillig int count=~-~-~-~-~-~-~-~-~-~-~-~-~-3; 41 1.5 rillig int same = + + + + + - - - - - 3; 42 1.5 rillig //indent end 43 1.5 rillig 44 1.5 rillig //indent run -di0 45 1.5 rillig int var = +3; 46 1.5 rillig int mixed = +-+-+-+-+-+-+-+-+-+-+-+-+-3; 47 1.5 rillig int count = ~-~-~-~-~-~-~-~-~-~-~-~-~-3; 48 1.5 rillig int same = + + + + +- - - - -3; 49 1.5 rillig //indent end 50 1.5 rillig 51 1.5 rillig 52 1.5 rillig /* 53 1.13 rillig * The operator '->' is special as it additionally suppresses the space between 54 1.13 rillig * the operator and its right operand. 55 1.5 rillig */ 56 1.5 rillig //indent input 57 1.5 rillig int var = p -> member; 58 1.5 rillig //indent end 59 1.5 rillig 60 1.5 rillig //indent run -di0 61 1.5 rillig int var = p->member; 62 1.5 rillig //indent end 63 1.6 rillig 64 1.6 rillig 65 1.6 rillig //indent input 66 1.6 rillig void 67 1.6 rillig unary_operators(void) 68 1.6 rillig { 69 1.6 rillig ++prefix_increment; 70 1.6 rillig --prefix_decrement; 71 1.6 rillig int *address = &lvalue; 72 1.6 rillig int dereferenced = *address; 73 1.6 rillig int positive = +number; 74 1.6 rillig int negative = -number; 75 1.6 rillig bool negated = !condition; 76 1.6 rillig } 77 1.6 rillig //indent end 78 1.6 rillig 79 1.6 rillig //indent run-equals-input -di0 80 1.7 rillig 81 1.7 rillig 82 1.10 rillig /* 83 1.10 rillig * Ensure that a '*' is not interpreted as unary operator in situations that 84 1.10 rillig * may look like a cast expression. 85 1.10 rillig */ 86 1.7 rillig //indent input 87 1.7 rillig { 88 1.11 rillig sbuf_t *sb = *(sbuf_t **)sp; 89 1.10 rillig return (int)(a * (float)b); 90 1.10 rillig a = (2 * b == c); 91 1.7 rillig } 92 1.7 rillig //indent end 93 1.11 rillig 94 1.11 rillig //indent run-equals-input -di0 95 1.12 rillig 96 1.12 rillig 97 1.12 rillig /* All asterisks from a pointer type are merged into a single token. */ 98 1.12 rillig //indent input 99 1.12 rillig { 100 1.12 rillig char* 101 1.12 rillig * 102 1.12 rillig * 103 1.12 rillig *x; 104 1.12 rillig char 105 1.12 rillig * 106 1.12 rillig * 107 1.12 rillig * 108 1.12 rillig *x; 109 1.12 rillig } 110 1.12 rillig //indent end 111 1.12 rillig 112 1.12 rillig //indent run 113 1.12 rillig { 114 1.12 rillig char ****x; 115 1.12 rillig char 116 1.12 rillig ****x; 117 1.12 rillig } 118 1.12 rillig //indent end 119