%EVAL

# %EVAL

Evaluates arithmetic and logical expressions using integer arithmetic

## Syntax

 %EVAL (arithmetic or logical expression)

The %EVAL function evaluates integer arithmetic or logical expressions. %EVAL operates by converting its argument from a character value to a numeric or logical expression. Then, it performs the evaluation. Finally, %EVAL converts the result back to a character value and returns that value.

If all operands can be interpreted as integers, the expression is treated as arithmetic. If at least one operand cannot be interpreted as numeric, the expression is treated as logical. If a division operation results in a fraction, the fraction is truncated to an integer.

Logical, or Boolean, expressions return a value that is evaluated as true or false. In the macro language, any numeric value other than 0 is true and a value of 0 is false.

%EVAL accepts only operands in arithmetic expressions that represent integers (in standard or hexadecimal form). Operands that contain a period character cause an error when they are part of an integer arithmetic expression. The following examples show correct and incorrect usage, respectively:

```%let d=%eval(10+20);       /* Correct usage   */
%let d=%eval(10.0+20.0);   /* Incorrect usage */```

Because %EVAL does not convert a value containing a period to a number, the operands are evaluated as character operands. When %EVAL encounters a value containing a period, it displays an error message about finding a character operand where a numeric operand is required.

An expression that compares character values in the %EVAL function uses the sort sequence of the operating environment for the comparison. Refer to "The SORT PROCEDURE" in the SAS Procedures Guide for more information on operating environment sort sequences.

All parts of the macro language that evaluate expressions (for example, %IF and %DO statements) call %EVAL to evaluate the condition. For a complete discussion of how macro expressions are evaluated, see Chapter 6, "Macro Expressions," in SAS Macro Language: Reference.

%EVAL performs integer evaluations, but %SYSEVALF performs floating point evaluations.

### Example 1: Illustrating Integer Arithmetic Evaluation

```%let a=1+2;
%let b=10*3;
%let c=5/3;
%let eval_a=%eval(&a);
%let eval_b=%eval(&b);
%let eval_c=%eval(&c);

%put &a is &eval_a;
%put &b is &eval_b;
%put &c is &eval_c;```

Submitting these statements prints to the SAS log:

```1+2 is 3
10*3 is 30
5/3 is 1```

The third %PUT statement shows that %EVAL discards the fractional part when it performs division on integers that would result in a fraction:

### Example 2: Incrementing a Counter

The macro TEST uses %EVAL to increment the value of the macro variable I by 1. Also, the %DO %WHILE statement implicitly calls %EVAL to evaluate whether I is greater than the value of the macro variable FINISH.

```%macro test(finish);
%let i=1;
%do %while (&i<&finish);
%put the value of i is &i;
%let i=%eval(&i+1);
%end;
%mend test;

%test(5)```
Executing this program writes these lines to the SAS log:
```The value of i is 1
The value of i is 2
The value of i is 3
The value of i is 4```

### Example 3: Evaluating Logical Expressions

Macro COMPARE comapres two numbers.

```%macro compare(first,second);
%if &first>&second %then %put &first > &second;
%else %if &first=&second %then %put &first = &second;
%else %put &first<&second;
%mend compare;

%compare(1,2)
%compare(-1,0)```

Executing this program writes these lines to the SAS log:

```1 < 2
-1 < 0```