我们介绍了算术表达式、赋值表达式、关系表达式、逻辑表达式。
现在介绍条件表达式和逗号表达式。
1、条件表达式
(1)语法格式:
表达式1 ? 表达式2 :表达式3
(2) 执行流程:
若表达式1的值为真,则返回表达式2,否则返回表达式3。
流程图如:
看起来有点不好理解,我用几个例子说明一下:
假设有定义int a, b, c;
而且有赋值:a=10;
那么下述表达式中,b的值为100:
b = ( a>0 ) ? 100 : 99 ;
上述表达式中a>0为真,所以b取问号后面那个值,即100。
下述表达式中,c的值为99:
c = ( a%2==1 ) ? 100 : 99 ;
上述表达式中a%2==1为假(a等于10是偶数,除以2的余数不是1),所以c取冒号后面那个值,即99。
程序1:
运行结果:
(3)条件表达式是if语句的简单写法
“表达式1 ? 表达式2 :表达式3”其实就是如下if语句:
if(表达式1)
表达式2;
else
表达式3;
如下if语句:
等价于:
同样,以下if语句:
等价于:
2、逗号表达式
(1)语法格式:
表达式1, 表达式2, ……, 表达式n
(2)执行流程:
先计算表达式1,然后计算表达式2,……,最后计算表达式n的值,并将表达式n的值作为逗号表达式的值。
例:
int a, b, c, n;
n = (a=2, b=3,c=a+b);
执行以后,a=2, b=3,c=5, n=5。
N取逗号表达式中最右边那个表达式的值。
(3)结合性:
逗号运算是左结合,从左算到右。
3、长度运算符 sizeof
sizeof是单目运算符,计算变量或数据类型的字节长度。
假设有定义:
int a;
则sizeof(a)是求整型变量 a 的长度,值为4,4个字节。
sizeof(int)则是求整型的长度,值为4字节。
sizeof(double)求双精度浮点型的长度,值为8字节。
4、算术运算、赋值运算、关系运算、逻辑运算、逗号表达式的优先级
在所有运算中逗号运算符的优先级最低。
一般来说,单目运算优先级最高,其次到算术运算,再到关系运算,再到逻辑运算,再到赋值运算,最后是逗号运算。
优先级:
最高:逻辑非(!)
第2: 算术运算符(单目运算优先于双目运算,双目运算中*、/由优先于+、-)
第3:关系运算符(其中优先于==、!=)
第4:逻辑与(&&)
第5:逻辑或(||)
第6:赋值运算符(=)
第7:逗号运算符
4、编程实例
我们来看一个例子:输入一串字符,以#结束,将其中的大写字母变成小写字母输出,小写字母变成大写字母输出,其他字符原样输出。
程序1:
运行结果:
程序1中输入字符用ch=getchar(),这句跟scannf(“%c”, &ch)是等价的。
输出字符用putchar(ch),这句跟printf(“%c”, ch)也是等价的。
再次强调:在程序中这些符号必须是英文状态。
所以程序1改成如下代码也是一样的。
程序2:
另外,去掉循环前那句输入字符和循环体内的输入字符,输入字符放在循环条件里,在修改while那行,将:
while( ch!=‘#’)
改为:
while( (ch=getchar( ) ) !=‘#’)
也得到一样的结果。
程序3:
程序1、2、3都是一样的。
我们以前讲过一次性输入一串字符,用scanf(“%s”,变量名)或者gets(变量名),但这个变量必须是字符数组变量而不是char型的变量,而且输入以回车结束。
用gets()输入字符串,回车时会自动在字符串末尾添加一个‘\0’作为字符串结束标志。
而我们的循环也可以这个结束标志作为循环结束条件。
所以这题也可以用字符数组编程。
程序4:
运行结果和程序1、2、3是一样的。
如果将程序4中的gets(ch)改成scanf(“%s”,ch)行不行呢?
程序5:
注意scanf(“%s”,ch),%s对应的变量名ch前面不要&。
另外,scanf(“%s”,ch)和gets(ch)不同的地方是什么还记得吗?
scanf(“%s”,ch)输入的字符串以空格结束,gets(ch)输入的字符串以回车结束。
程序5运行结果:
空格后面的输入字符被自动忽略了。
5、总结
今天讲了条件表达式、逗号表达式,还讲了长度运算符sizeof,给出各种运算的优先级,最后给出一个例子用各种方法输入字符串。