我在下面有这个代码,我需要它将elig_factor [2]设置为1,当status为= 1且hudadmin为1或2或3时,设置为elgi_factor [2] = 0。但无论如何它设置了elig_factor [2] = 0。有人可以帮忙吗?
if ("&r_start" eq 1) then
do;
if ( 2011<=built <= 2014) then elig_factor[1] = '1';
else elig_factor[1] = '0';
if (status eq '1' and hudadmin eq '1') then elig_factor[2] = '1';
else elig_factor[2] = '0';
if (status eq '1' and hudadmin eq '2') then elig_factor[2] = '1';
else elig_factor[2] = '0';
if (status eq '1' and hudadmin eq '3') then elig_factor[2] = '1';
else elig_factor[2] = '0';
if (np_all gt 0) then elig_factor[3] = '1';
else elig_factor[3] = '0';
if (np_black gt 0) then elig_factor[4] = '1';
else elig_factor[4] = '0';
if (np_age65 gt 0) then elig_factor[5] = '1';
else elig_factor[5] = '0';
if (np_hisp gt 0) then elig_factor[6] = '1';
else elig_factor[6] = '0';
elig_factor[7] = occ;
elig_factor[8] =vac;
end;
答案 0 :(得分:2)
当你说:
时,你几乎自己回答了这个问题当状态为= 1且hudadmin为1或2或3时
我不确定你为什么没有在这里使用in
运算符。
无论如何,要解释你的代码实际做什么:
if (status eq '1' and hudadmin eq '1') then elig_factor[2] = '1';
else elig_factor[2] = '0';
if (status eq '1' and hudadmin eq '2') then elig_factor[2] = '1';
else elig_factor[2] = '0';
if (status eq '1' and hudadmin eq '3') then elig_factor[2] = '1';
else elig_factor[2] = '0';
依次评估每个if
语句,忽略过去if
语句的结果。因此,如果您遇到hudadmin = 1
,然后触发第一个if
语句,将elig_factor[2]
设置为'1'
,则忽略后续else
。
当达到第二个 if
语句时,会检查它并找到FALSE
,因此运行else
语句,设置{{1 }} elig_factor[2]
,尽管之前已将其设置为'0'
。
所以你有两个选择:
修改您的代码,使其达到您想要的效果
'1'
这会检查if (status eq '1' and hudadmin eq '1') then elig_factor[2] = '1';
else if (status eq '1' and hudadmin eq '2') then elig_factor[2] = '1';
else if (status eq '1' and hudadmin eq '3') then elig_factor[2] = '1';
else elig_factor[2] = '0';
是否为hudadmin = '1'
,如果没有hudadmin='2'
,则检查'3'
是否hudadmin
,仅检查'1'
不是'2'
,'3'
或elig_factor[2] = '0'
然后设置in
。
代码是合理的,但有点过度设计,我会采用以下方法
使用if (status eq '1' and hudadmin in ('1','2','3')) then elig_factor[2] = '1';
else elig_factor[2] = '0';
运算符
int shared_variable;
int get_shared_variable() {
int result;
pthread_mutex_lock(&shared_variable_mutex);
result = shared_variable;
pthread_mutex_unlock(&shared_variable_mutex);
return result;
}
void* thread_routine(void *arg) {
while (get_shared_variable() < 5000) {
printf();
printf();
sleep(2);
int i = 0;
while (pthread_mutex_trylock(&foo_mutexes[i]) != 0) {
i++;
pthread_mutex_lock(&foo_count_mutex);
if (i == foo_count) {
pthread_mutex_unlock(&foo_count_mutex);
sleep(1); // wait one second and retry
i = 0;
}
pthread_mutex_unlock(&foo_count_mutex);
}
pthread_mutex_lock(&shared_variable_mutex);
shared_variable += 10;
pthread_mutex_unlock(&shared_variable_mutex);
}
return NULL;
}
这在一个陈述中检查条件,更容易阅读,并且可以说更有效率。
答案 1 :(得分:1)
如果使用布尔结果,这实际上更容易。下面唯一的区别是它会返回数字结果 - 如果您必须将'1'
然后put
每个都添加到一个字符中,或者将它们中的每一个包装在cats
中。
if ("&r_start" eq 1) then
do;
elig_factor[1] = ( 2011<=built <= 2014) ;
elig_factor[2] = (status eq '1' and hudadmin in ('1','2','3'));
elig_factor[3] = (np_all gt 0) ;
elig_factor[4] = (np_black gt 0);
elig_factor[5] = (np_age65 gt 0);
elig_factor[6] = (np_hisp gt 0);
elig_factor[7] = occ;
elig_factor[8] = vac;
end;