1.优先级
巧记:非→算数→关系→和与→赋值
- 在六个关系运算符中,<,<=,>,>=的优先级相同,高于==和!=, ==和!=的优先级相同。
逻辑关系中:&& 的高于其他||… - 优先级【高到低】:
第一级:
圆括号【()】、下标运算符【[]】、分量运算符的指向结构体成员运算符【->】、结构体成员运算符【.】
第二级:
逻辑非运算符【!】、按位取反运算符【~】、自增自减运算符【++ --】、负号运算符【-】、类型转换运算符【(类型)】、指针运算符和取地址运算符【和&】、长度运算符【sizeof】
第三级:乘法运算符【】、除法运算符【/】、取余运算符【%】
第四级:加法运算符【+】、减法运算符【-】
第五级:左移动运算符【<<】、右移动运算符【>>】
第六级:关系运算符【< > <= >= 】
第七级:等于运算符【==】、不等于运算符【!=】
第八级:按位与运算符【&】
第九级:按位异或运算符【^】
第十级:按位或运算符【|】
第十一级:逻辑与运算符【&&】
第十二级:逻辑或运算符【||】
第十三级:条件运算符【?:】
第十四级:赋值运算符【= += -= *= /= %= >>= <<.= &= |= ^=】
第十五级:逗号运算符【,】
2.表达式运算难点
- 表达式1? 表达式2: 表达式3
↑条件运算符的结合方式是自右向左
a>b?a:c>d?c:b
就是a>b?a:(c>d?c:b)
其求值规则为:如果表达式1的值为真,则以表达式2 的值作为条件表达式的值,否则以表达式2的值作为整个条件表达式的值。 - List item
3.输入输出
输入 格式字符串
格式字符串的一般形式为:
%[*][类型][输入数据宽度][长度]类型
其中有方括号[]的项为任选项。各项的意义如下:
-
类型:表示输入数据的类型,其格式符和意义如下所示。
格式 :字符意义
d:输入十进制整数
o:输入八进制整数
x:输入十六进制整数
u:输入无符号十进制整数
f或e:输入实型数(用小数形式或指数形式)
c:输入单个字符
s:输入字符串 -
“*”符:用以表示该输入项,读入后不赋予相应的变量,即跳过该输入值。
如:scanf("%d %*d %d",&a,&b);
当输入为:1 2 3时,把1赋予a,2被跳过,3赋予b。 -
宽度:用十进制整数指定输入的宽度(即字符数)。
例如:scanf("%5d",&a);
输入:12345678
只把12345赋予变量a,其余部分被截去。
又如:scanf("%4d%4d",&a,&b);
输入:12345678
将把1234赋予a,而把5678赋予b。 -
长度:长度格式符为l和h,l表示输入长整型数据(如%ld) 和双精度浮点数(如%lf)。h表示输入短整型数据。
使用scanf函数还必须注意以下几点:
-
scanf函数中没有精度控制,如:scanf("%5.2f",&a);是非法的。不能企图用此语句输入小数为2位的实数。
-
scanf中要求给出变量地址,如给出变量名则会出错。如 scanf("%d",a);是非法的,应改为scnaf("%d",&a);才是合法的。
-
在输入多个数值数据时,若格式控制串中没有非格式字符作输入数据之间的间隔则可用空格,TAB或回车作间隔。C编译在碰到空格,TAB,回车或非法数据(如对“%d”输入“12A”时,A即为非法数据)时即认为该数据结束。
-
在输入字符数据时,若格式控制串中无非格式字符,则认为所有输入的字符均为有效字符
例如:scanf("%c%c%c",&a,&b,&c); 输入为:d e f
则把’d’赋予a, ’ ’ 赋予b,'e’赋予c。
只有当输入为:def时,才能把’d’赋于a,'e’赋予b,'f’赋予c。
如果在格式控制中加入空格作为间隔,
如:scanf ("%c %c %c",&a,&b,&c);
则输入时各数据之间可加空格。 -
如果格式控制串中有非格式字符则输入时也要输入该非格式字符。
例如:scanf("%d,%d,%d",&a,&b,&c);
其中用非格式符“ , ”作间隔符,故输入时应为:5,6,7
又如:scanf(“a=%d,b=%d,c=%d”,&a,&b,&c);
则输入应为:a=5,b=6,c=7 -
如输入的数据与输出的类型不一致时,虽然编译能够通过,但结果将不正确。