我必须为以下人员的结构编写if语句:
年龄大于或等于16,年龄小于或等于20姓名的第一个字母必须是's'或'n'
我的代码:
if(x.name[0]=='s' ||
x.name[0]=='n' &&
x.surname[0]=='s' ||
x.surname[0]=='n' &&
(x.age>=16 && x.age<=20))
{
/* print person */
}
我只想把这些人打印出来,但代码打印的是不合规的年龄。
这种情况怎么了?
将每个||
节括在括号中。请记住,&&
的优先级高于||
。像这样:
if((x.name[0]=='s' || x.name[0]=='n') &&
(x.surname[0]=='s' || x.surname[0]=='n') &&
(x.age>=16 && x.age<=20))
不需要将代码拆分成几行,只需使代码更可读即可。
这应该有效:
(x.name[0]=='s' || x.name[0]=='n') && (x.surname[0]=='s' || x.surname[0]=='n') && (x.age>=16 && x.age<=20)
添加了额外的一对()。此外,你知道这样繁琐的陈述被认为是一种非常糟糕的做法吗?
名称和姓氏周围缺少括号的条件
if((x.name[0]=='s' || x.name[0]=='n') && (x.surname[0]=='s' || x.surname[0]=='n') && (x.age>=16 && x.age<=20))
查看语句
if(x.name[0]=='s' ||
x.name[0]=='n'&;x.姓氏[0]==的'||x.姓氏[0]=='n'&;(x.age>=16&&x.age<=20))
编译器将其解释为
if(x.name[0]=='s' || (x.name[0]=='n' && x.surname[0]=='s') ||
(x.surname[0]=='n' && x.age>=16) && x.age<=20))
这背后的原因是,逻辑运算符&&
的优先级高于逻辑运算符||
的优先级那是什么意思
这意味着该表达式(子表达式)与&&
的结合比与||
的结合更紧密
举一个小例子来理解这个
#include <stdio.h>
int main(void)
{
int i = 1, j = 1, k = 1;
printf("%d ", i++ || ++j && ++k);
printf("%d %d %d", i, j, k);
return 0;
}
该程序的输出为:
1
2 1 1
乍一看,新手可能会认为输出是错误的,应该是
1
2 1 2
认为CCD_ 8和CCD_。由于&&
的优先级高于||
,因此子表达式j++
和k++
绑定到&&
,编译器将其解释为i++ || (++j && ++k)