2015-05-22 2 views
0
%macro test(k); 

%if &k le 0 %then %put < 0 ; 
%else %put > 0; 
%mend test; 
%test(-5); 
%test(3.1); 

Но %test(-3.1); будет генерировать ошибкумакро ошибка: Персонаж операнд был найден в функции% EVAL или% IF условие

ERROR: A character operand was found in the %EVAL function or %IF condition where a numeric operand is required. The condition was: 
     &k le 0 

Я понятия не имею, почему это простое сравнение значения приведет к ошибке. Сначала я думаю, что это потому, что .. Но ввод 3.1 кажется, все идет хорошо.

+0

'% sysevalf (& k le 0)' решает это. Но почему '-5' не нужно' sysevalf'? – Lovnlust

+0

Код в порядке. Я не вижу причин, чтобы он не работал. Возможно, перезапустите приложение и повторите попытку – NEOmen

+0

Согласитесь с NEOmen, код в порядке –

ответ

3

Оператор макросов% IF неявно вызывает функцию% EVAL(). % EVAL() понимает целые числа (положительные или отрицательные), но не десятичные значения. Когда% EVAL() сравнивает два значения, если один из них является десятичным, он будет сравнивать CHARACTER. Таким образом,% IF (3.1> 10) возвращает true. Если вы дадите% EVAL десятичное число с отрицательным знаком перед ним (-3.1), это ошибки, потому что он считает, что символ 3.1 не является числом, поэтому знак - должен быть оператором вычитания, а затем вы пытаетесь вычесть символьные значения. Ниже приведены некоторые примеры игры с% eval().

%put %eval(10 > 2) ; /*true: numeric comparison*/ 
%put %eval(10.1 > 2) ; /*false: character comparison*/ 

%put %eval(-2 > -5) ; /*true: numeric comparison*/ 
%put %eval(2.0 > -5) ; /*true: character comparison*/ 

%put %eval(+10 > +2) ; /*true: numeric comparison*/ 
%put %eval(-10 > +2) ; /*false: numeric comparison*/ 
%put %eval(10.1 > +20) ; /*false: character comparison (+20 is evaluated to 20) */ 
%put %eval(+10.1 >+20) ; /*error: %eval() cant handle +10.1*/ 
%put %eval(-10.1 >+20) ; /*error: %eval() cant handle -10.1*/ 

%put %eval(-2); /* -2 */ 
%put %eval(+2); /* 2 */ 
%put %eval(-2.1); /*error*/ 
%put %eval(+2.1); /*error*/ 
0

Вы должны использовать sysevalf для вычисления арифметических и логических выражений с использованием арифметики с плавающей запятой. Как вы указали, %sysevalf(&k le 0) решит проблему.

+0

Но без '% sysevalf', 3.1 работает. – Lovnlust