如果声明结构

时间:2013-11-18 17:27:37

标签: c if-statement structure

我必须为以下人士的结构撰写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 */
}

我想打印出这些人,但代码打印出不合规的年龄。

病情有什么问题?

4 个答案:

答案 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}}

相关问题