正文

[022] 条件运算符2006-02-19 14:18:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/wentao/10254.html

分享到:

条件运算符要求有3个操作对象,称三目(元)运算符,它是c语言中唯一的一个三目运算符。条件表达式的一般形式为:
  表达式1?表达式2∶表达式3
(1) 条件运算符的执行顺序:先求解表达式1,若为非0(真)则求解表达式2,此时表达式2的值就作为整个条件表达式的值。若表达式1的值为0(假),则求解表达式3,表达式3的值就是整个条件表达式的值。
        max = (a>b) ? a : b

执行结果就是将条件表达式的值赋给max。也就是将a和b二者中大者赋给max。

(2) 条件运算符优先于赋值运算符,因此上面赋值表达式的求解过程是先求解条件表达式,再将它的值赋给max。

条件运算符的优先级别比关系运算符和算术运算符都低。因此
        max = (a > b) ? a : b
括号可以不要,可写成
        max = a > b ? a : b
如果有
        a > b ? a : b+1
相当于a > b ? a : (b+1), 而不相当于(a>b ? a : b)+1。

(3) 条件运算符的结合方向为“自右至左”。如果有以下条件表达式:
a > b ? a : c > d ? c : d相当于a > b ? a : (c > d ? c : d)

如果a=1,b=2,c=3,d=4,则条件表达式的值等于4。

(4) 条件表达式还可以写成以下形式:
  a>b? (a=100) : (b=100)

       a>b? printf("%d",a) : printf("%d",b);

“表达式2”和“表达式3”不仅可以是数值表达式,还可以是赋值表达式或函数表达式。上面第二个条件表达式相当于以下if-else语句:

  if(a>b) printf("%d", a);
  else printf("%d", b);

(5) 条件表达式中,表达式1的类型可以与表达式2和表达式3的类型不同。如x? 'a':  'b'
x是整型变量,若x=0,则条件表达式的值为'b'。表达式2和表达式3的类型也可以不同,此时条件表达式的值的类型为二者中较高的类型。如

  x>y? 1 : 1.5

如果x≤y,则条件表达式的值为1.5,若x>y,值应为1,由于1.5是实型,比整型高,因此,将1转换成实型值1.0。

(6) 条件表达式不能取代一般的if语句,只有在if语句中内嵌的语句为赋值语句(且两个分支都绐同一个变量赋值)时才能代替if语句。如以下if语句就无法用一个条件表达式代替.

    if (a>b) printf("%d",a);
    else printf("%d",b);

但可以用下面的语句代替:

    printf ("%d", a>b? a : b ); 即将条件表达式的值输出。

这个方法有点意思,以前没见过,收藏着。该站第一界编程比赛中有个叫"knocker"的"家伙"编的程序短小精悍,其中就有这么个东东

http://www.programfan.com/club/showbbs.asp?id=112966

--------------------------------------
试验小程序:
<1>
#include
int main()
{
    int a, b;
    scanf("%d %d", &a, &b);
    printf("%d\n", a>b? (a=100) : (b=100) ); // a>b由输入的a,b值判断, 与后面赋值无关
    return 0;
}

<2>
#include
int main()
{
    int a, b;
    scanf("%d %d", &a, &b);
    a>b? printf("%d\n",a):printf("%d\n",b);   //总是输出两个数中最大者,呵呵
    return 0;
}

<3>
#include
int main()
{
    int a, b;
    scanf("%d %d", &a, &b);
    printf("%d\n", a > b ? a : b);  //<2>的改进,看上去简洁点 ^_^
    return 0;
}

<4> 大写转小写
#include
int main()
{
    char ch;
    ch = getchar();
    ch = (ch >= 'A' && ch <= 'Z' ? ch+32 : '*' );    //这个方法不错
    if (ch != '*') putchar(ch), putchar('\n');
    return 0;
}

大写字母的ASCII码小, 小写字母的ASCII码大, 相差32 , 如果"不慎"忘了这个差是32, 还可以用 'a'-'A' 来代替,即

#include
int main()
{
    char ch;
    ch = getchar();
    ch = (ch >= 'A' && ch <= 'Z' ? ch+('a'-'A') : '*' );
    if (ch != '*') putchar(ch), putchar('\n');
    return 0;
}

 

阅读(6159) | 评论(1)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册