1.运算符的优先级
如有定义int a=11;那么执行完a+=a-=a*a后,a的值为( ) 。
A. 121
B. 220
C. -220 正确答案
D. -110
首先a的值是11。
现在来分析式子a += a -= a*a。我们通过查表可知,里面优先级最低的是赋值运算符:+=、-=,有两个优先级最低的运算符,继续查表:发现赋值运算符的结合性是从右到左,所以:(a) += (a) -= (a*a)会先计算 a -= a*a (也就是a=a-a*a), a -= a*a 表达式的结果是赋值号左边的 a值,a的值为-110。
继续分析:式子还剩下:a += -110(也就是a = a + (-110)),并且a的值是-110 ,,所以整个表达式的结果是-220。
2.逻辑运算(偷懒的计算机)
以下程序段的执行结果为:( )
int x = 0,y = 0,z = 0;
++x || ++y && z++;
printf("x=%d,y=%d,z=%d\n", x , y , z );
A. x=0,y=0,z=0
B. x=1,y=0,z=0 正确答案
C. x=1,y=1,z=0
D. x=1,y=1,z=1
答案解析:
考察的点是:自增运算符、逻辑运算符的使用。难点++在前与在后的区别,易错点:计算机运行逻辑运算符的偷懒操作。
++x||++y&&z;++式子看起来有点复杂,先找式子中优先级最低的运算符进行分解。,查表可知逻辑或||的优先级比逻辑与&&要低,因此得到:(++x) || (++y&&z;++ ),也就是左操作数||右操作数。
左操作数的计算:++x。++在前会先是变量x自身的值+1,x=1,再来使用x的值作为++x表达式的结果,所以++x的值为1。
非零表示真,逻辑或左操作数已经为真,右边的操作数不会改变逻辑或运算符表达式的值,这时候计算机进行偷懒,不会执行右操作数。所以x=1,y=0,z=0。
3.scanf的报错
从键盘输入三个数据,输出其中最大的数(如果有数据相等也只输出其中一个较大的数据)。
提示:能够使用条件运算符(三目运算符)或者分支选择结构实现
编程思路:
假设定义两个变量a、b,并赋了初值。
a>=b?a:b,该表达式可以得到a和b中的较大值。
现在比较三个数,得到最值。可以先前两个数据进行比较,保存较大值,再将这个较大值与第三个数据进行比较即可。
参考代码:
#define _CRT_SECURE_NO_WARNINGS//后面是没有分号的
#include<stdio.h>
int main()
{
float a, b, c;
scanf("%f %f %f", &a, &b, &c);
printf("%2.2f", (a >= b ? a : b) >= c ? (a >= b ? a : b):c);
return 0;
}
附上自己的暴力代码,相形见绌啦
int a, b, c, Larger_value, Max_value;//我的命名还是很严谨滴哈哈
scanf_s("%d %d %d",&a,&b,&c);//vs不信任scanf,这里的scanf_s()只让vs信服,还是加命令屏蔽好一些 #define _CRT_SECURE_NO_WARNINGS
Larger_value = (a > =b) ? a : b;
Max_value = (Larger_value > =c)? Larger_value: c;
printf("%d", Max_value);