条件运算符要求有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;
}
评论