关于一些零碎的注意问题
1.关于scanf与printf的返回值
1. scanf 函数是有返回值的,它的返回值可以分成三种情况 1) 正整数,表示正确输入参数的个数。例如执行 scanf("%d %d", &a, &b); 2) 0,表示用户的输入不匹配,无法正确输入任何值。如上例,用户如果输入",3 4",返回0。 3) EOF,这是在 stdio.h 里面定义的常量(通常值为-1),表示输入流已经结束。在Windows下,用户按下CTRL+Z,就表示输入结束;Linux/Unix下使用CTRL+D 2. 为什么前面 scanf 的格式串里面,%s 和 %c 中间需要空格呢? 那是因为如果没空格的话。。。oldchar输入的就是空格了= =. 3. 顺便说一下,printf 的返回值是输出的字符数,例如,printf("1234")的返回值是4,而printf("1234\n")的返回值是5。
2.关于比赛时的 ~ scanf与scanf != EOF
EOF一般为-1,那么scanf("%d",&n)!=-1等价于~scanf("%d”,&n)
3.关于动态数组问题
int n; scanf("%d",&n); int a[n];//错误 //注意VC++6.0的标准是不允许定义动态数组的,不过现在的标准貌似都支持,所以这一点可以忽略
4.long long int类型
long long 类型的0表示为 0LL
5.unsigned int类型
很多STL的函数返回值为unsigned ,所以还是比较常用
使用unsigned int类型要注意
unsigned int的 0减1会变为正无穷
6.短路特性的使用及注意事项
//短路特性不能把++放在if的括号里边,否则第二个++可能无法生效 if(ans1>=flag&&ans2>=flag){ break; ans1++,ans2++; }
7.printf()函数输出double类型问题
printf()函数中不存在% l f
printf()输出double类型数据不能用 lf 否则会出错
8.bool类型问题
尽量不要把0和1当作false和true来用
因为如果0不小心减1变成负数就没法作为正常判断条件终止了
9.define问题
//define时千万不要重定义系统的关键字,不然后面用到的时候会报错,找错误找到自闭 #define max 1000
10.全局数组和变量
全局数组和变量定义后默认均为0
11.说说关于双重for循环的变量定义
//变量能少定义就少定义 //不要定义重名变量 //定义变量时尽量有点技术含量,不要搞一堆a,b,i,j来糊弄人
//最好不要定义成 i j,因为太难分辨了,哈哈 //如果写了i,j一定要注意不要用混了
12.%c输入字符
1. //能不用%c尽量不要用 //哪怕要输入一个字符,也要定义一个字符数组str【】,输入%s,用str[0] 表示一个字符 2. int n; char a,b; scanf("%d",&n); scanf(" %c %c",&a,&b);//注意%c前面有一个空格哦,这样就不用吞回车
13.结构体的初始化
struct node { int x,y; node(){x=0,y=0;} };
struct node { int x,y; node(){x=0,y=0;} node(int xx,int yy)//构造函数,不定义对象就可以作为参数 { x=xx,y=yy; } }; queue<node>q; q.push(node(1,2));//直接调用构造函数 //而不需 node se; se.x=1,se.y=2; 然后q.push(se);q.push(se);
14.无穷大定义
#define inf 0x3f3f3f3f