我必须为以下人士的结构撰写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 */
}
我想打印出这些人,但代码打印出不合规的年龄。
病情有什么问题?
答案 0 :(得分:3)
将每个||
部分括在括号中。请注意,&&
的优先级高于||
。像这样:
if((x.name[0]=='s' || x.name[0]=='n') &&
(x.surname[0]=='s' || x.surname[0]=='n') &&
(x.age>=16 && x.age<=20))
不需要在几行上拆分代码,只是使代码更具可读性。
答案 1 :(得分:1)
您姓名和姓氏条件的缺失括号
if((x.name[0]=='s' || x.name[0]=='n') && (x.surname[0]=='s' || x.surname[0]=='n') && (x.age>=16 && x.age<=20))
答案 2 :(得分:1)
这应该有效:
(x.name[0]=='s' || x.name[0]=='n') && (x.surname[0]=='s' || x.surname[0]=='n') && (x.age>=16 && x.age<=20)
添加了额外的一对()。另外,你知道这些繁琐的陈述被认为是一种非常糟糕的做法吗?
答案 3 :(得分:1)
看到声明
if(x.name[0]=='s' ||
x.name [0] =='n'&amp;&amp;
x.surname [0] =='s'||
x.surname [0] =='n'&amp;&amp;
(x.age&gt; = 16&amp;&amp; x.age&lt; = 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
认为i++ || ++j && ++k
与(i++ || ++j) && ++k
相同,但事实并非如此。由于&&
优先级高于||
,子表达式j++
和k++
绑定到&&
,编译器将其解释为{{ 1}}