The document discusses increment and decrement operators (++ and --) in the C programming language. It provides examples of how these operators work, including in expressions like a++b and a++++b. It notes that the ++ and -- operators were among the first features introduced in C to generate more compact code than adding or subtracting 1 from a variable. The operators remain useful today for their brevity. The document also discusses how the "maximum munch" rule applies to these operators during lexical analysis of C code.
The document discusses increment and decrement operators (++ and --) in the C programming language. It provides examples of how these operators work, including in expressions like a++b and a++++b. It notes that the ++ and -- operators were among the first features introduced in C to generate more compact code than adding or subtracting 1 from a variable. The operators remain useful today for their brevity. The document also discusses how the "maximum munch" rule applies to these operators during lexical analysis of C code.
The document discusses increment and decrement operators (++ and --) in the C programming language. It provides examples of how these operators work, including in expressions like a++b and a++++b. It notes that the ++ and -- operators were among the first features introduced in C to generate more compact code than adding or subtracting 1 from a variable. The operators remain useful today for their brevity. The document also discusses how the "maximum munch" rule applies to these operators during lexical analysis of C code.
The document discusses increment and decrement operators (++ and --) in the C programming language. It provides examples of how these operators work, including in expressions like a++b and a++++b. It notes that the ++ and -- operators were among the first features introduced in C to generate more compact code than adding or subtracting 1 from a variable. The operators remain useful today for their brevity. The document also discusses how the "maximum munch" rule applies to these operators during lexical analysis of C code.
Copyright:
Attribution Non-Commercial (BY-NC)
Available Formats
Download as PDF, TXT or read online from Scribd
Download as pdf or txt
You are on page 1of 1
_____________________________________________ Guest Column | The Joy of Programming
S.G. Ganesh
Understanding Increment and
Decrement Operators in C Almost all programmers who work in C-based languages use the ++ and -- operators. Let’s look at some interesting aspects of these operators in C.
I ncrement/decrement operators are good examples
to explain the curt (concise) syntax of C language: (a), PLUS (+), VARIABLE(B) as output, which is a valid sequence of tokens for compilation to succeed. Now, how about the expression a++b? It is treated as void strcpy(char *t, const char *s) { a ++ b, and not (a + (+b)), and results in a compiler error. while(*t++ = *s++); How about a+++b? It becomes ((a++) + b), so it’s fine. } Expression a++++b? It is ((a++) (++b)), so it is a compiler error. Hmm, how about a++++b? It is ((a++) ++) (+b)), In this strcpy function, the while loop continues which is again a compiler error. Note that, in all these copying chars from source to target, till it reaches the end cases, if we use explicit white-space or parenthesis, we of the string ('\0' character). can get valid expressions: (a+ (+b)), ((a++) + b), ((a++) Here is another example; can you guess the output of + (+b)), and ((a++) + (++b)). If we try adding more +s this code segment? after this, we cannot get a valid expression for integer arguments (but we might get valid ones in case of char str[] = “oh”, *p = str; pointers, for example). while (*p) Today, C-based languages (C++, Java, etc) rule ++*p++; the programming world; because of this, almost all printf(str); programmers are aware of the ++ and -- operators, and how powerful they are in expressing operations. How is the expression ++*p++ treated? The postfix What even experienced programmers do not know is increment/decrement is part of the operators with that the C family was the first to introduce the ++ and highest precedence; the dereference and prefix -- operators! Ken Thompson, while implementing the B increment/decrement is at the next precedence level compiler, noticed that increment operations generate and their associativity is from right to left. So, the more compact code than adding 1 to a variable and expression is treated as: (++(*(p++))). p is a pointer to storing it back. In other words, an increment was string “oh”. In the while loop, p++ is executed first, but one instruction while adding 1 and storing it back its effect doesn't take place till the statement execution was more than one instruction. So he implemented completes. The result of p++ (which is still the value of the prefix ++ (and --) operators, and generalised it by p) is dereferenced with *. For the first character it is 'o'. adding a postfix version. Interestingly, this short code- Now, prefix ++ increments the character value, so its generation advantage is still true for recent languages. value is 'p'. The same happens for the next character, For example, in Java, integer increment would generate 'h', which becomes 'i'. Now the end of the character is one instruction (iinc) compared to the four instructions reached, so the while loop terminates. The printf now for adding 1 to the variable and storing it back (iload_x, prints the modified string, which is “pi”. iconst_1, iadd and istore_x instructions)! We can use ++/-- operators to illustrate the 'maximum munch' rule in C lexical analysis. Simply About the author: stated, the lexical analyser (lexer) looks for a match for S G Ganesh is a research engineer in Siemens (Corporate Technology). His latest book is ‘Cracking the C, C++ and Java the longest token. For example, consider the expression Interview’, published by Tata McGraw-Hill. You can reach him at a+b, where a and b are integer variables. Given this as sgganesh@gmail.com. input in a C program, the lexer might give VARIABLE
www.LinuxForU.com | LINUX For You | FEBRUARY 2010 | 13