c-结构的If语句



我必须为以下人员的结构编写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'&amp;x.姓氏[0]==的'||x.姓氏[0]=='n'&amp;(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)

最新更新