Inc and Dec

From Free Pascal wiki

English (en)


The procedures inc and dec increment or decrement a given variable by default by one.

usage

The first parameter specifies an ordinal value variable (e.g. an integer or enumeration type) and the second optional parameter may specify a different addend/subtrahend.

 1 program incDecDemo(input, output, stderr);
 2 
 3 type
 4 	primaryColor = (red, green, blue);
 5 
 6 var
 7 	phase: primaryColor;
 8 	x: longint;
 9 
10 begin
11 	// enumeration type
12 	phase := red;
13 	inc(phase); // phase becomes green
14 	writeLn(phase);
15 	
16 	// integer
17 	x := 1;
18 	inc(x, -1); // x becomes zero
19 	writeLn(x);
20 	
21 	x := 1;
22 	dec(x); // same as above: x becomes zero
23 	writeLn(x);
24 end.

background

In FPC's system unit the inc and dec procedures are compiler procedures. They exist in order to optimize for certain architectures where dedicated inc and dec assembler instructions are available.

special behaviors

If {$rangeChecks} are turned on, those procedures may generate a run-time error (RTE 201). Also {$overflowChecks} may be generated (with a small difference in TP mode).

If pointer arithmetics are allowed by the {$pointerMath} compiler switch, inc and dec work on pointers, too. In the case of typed pointers, e.g. a pointer to a record, the target's type size is considered automatically. For instance

 1 program pointerIncDemo(input, output, stderr);
 2 
 3 {$pointerMath on}
 4 
 5 var
 6 	p: PQWord;
 7 
 8 begin
 9 	inc(p);
10 	inc(p, 3);
11 end.

will generate (excerpt):

13 ; [pointerIncDemo.pas]
14 ; [8] begin
15 	leaq	-8(%rsp),%rsp
16 .Lc3:
17 ; Var p located in register rax
18 	call	FPC_INITIALIZEUNITS
19 	movq	$0,%rax
20 ; [9] inc(p);
21 	addq	$8,%rax
22 ; [10] inc(p, 3);
23 	addq	$24,%rax
24 ; [11] end.
25 	call	FPC_DO_EXIT
26 	leaq	8(%rsp),%rsp
27 	ret

see also