1.scanf函数的返回值
通常我们在使用scanf输入数据时,并不会用到scanf函数的返回值,但其实scanf函数是有返回值的。
#include<stdio.h>
int main()
{
int a,b,c;
a = b = c = 0;
int ret = scanf("%d%d%d",&a,&b,&c);
printf("ret = %d\n",ret);
printf("a = %d,b = %d,c = %d",a,b,c);
return 0;
}
所谓的返回值是一个整数,表示成功读取的变量个数。
如果没有读取任何项,或者匹配失败,则返回 0。
如果在成功读取任何数据之前,发生了读取错误或者遇到读取到文件结尾,则返回常量EOF(-1)。
ctrl+z 可以让scanf返回-1。
2.if 的判定
(1)如下代码:
#include<stdio.h>
int main()
{
int i = 0,a = 0,b = 2, c = 3,d = 4;
i = a++ && ++b && d++;
printf(" a = %d\n b = %d \n c = %d\n d = %d\n",a,b,c,d);
return 0;
}
运行结果:
为什么b与d没有加1呢,其实是因为a后增,先赋值等于0,再自增等于1。
而&&识别到非真就退出判定,没有进行后面的操作。
(2)如下代码:
#include<stdio.h>
int main()
{
int i = 0,a = 0,b = 2, c = 3,d = 4;
i = ++a && ++b && d++;
printf(" a = %d\n b = %d \n c = %d\n d = %d\n",a,b,c,d);
return 0;
}
如果a是前置增量,那么b与d就发生变化了。
(3)如下代码:
#include<stdio.h>
int main()
{
int i = 0,a = 0,b = 2, c = 3,d = 4;
i = ++a || ++b || d++;
printf(" a = %d\n b = %d \n c = %d\n d = %d\n",a,b,c,d);
return 0;
}
那么为什么这段代码中b与d又不变了呢?
是因为 || 操作符,当其中一个表达式为真(非零)时,整个表达式的结果为真。为真则退出判定。
3.赋值忽略符
当我们输入年月日等习惯加格式的代码时,可能会出现这种问题:
#include<stdio.h>
int main()
{
int year,month,day;
year = month = day =0;
scanf("%d%d%d",&year,&month,&day);//输入年月日
printf("%d-%d-%d",year,month,day);
return 0;
}
那么怎么解决呢?在输入时不添加格式?难免有点别扭,此时我们就应用到一个少用的操作符
%*c:
#include<stdio.h>
int main()
{
int year,month,day;
year = month = day =0;
scanf("%d%*c%d%*c%d",&year,&month,&day);
printf("%d-%d-%d",year,month,day);
return 0;
}
该占位符就不会返回值,解析后就会被丢弃。
4.
最小宽度和小数位数这两个限定值,都可以用*来代替
#include<stdio.h>
int main()
{
printf("%*.*f",6,2,1111.4);
return 0;
}