1.输出变量的顺序偷换
int i, j;
i = 10;
j = 20;
printf("i = %d, j = %d", j, i); //这里i,j的值反过来了
2.运算符’/‘与’%'看错
int number;
number = 11;
printf("%d-%d-%d\n", number/2, number/3, number/12);
3.输入时忽略了输入格式
double x;
scanf("x=%lf", &x); //输入:x=30
printf("%.2f", x); //输出:30.00
4.循环体内有毒的赋值
int i, sum;
for (i = 1; i <= 10; i++){
sum = 0; //有毒的赋值
sum = sum + i;
}
[例1]
int fahr;
double celsius;
for (fahr = 91 ; fahr <= 100; fahr++) //非循环体语句,下面的语句①才是
celsius = 5.0 * (fahr - 32) / 9.0; /* 语句① 执行了10次 */
printf("%4d%6.1f\n", fahr, celsius); /* 语句② 执行了1次(不在循环体内 */
[例2]
int fahr;
double celsius;
for (fahr = 121 ; fahr <= 125; fahr++) ; //注意这里的分号,即没有循环体语句
celsius = 5.0 * (fahr - 32) / 9.0; /* 语句① */
printf("%4d%6.1f\n", fahr, celsius); /* 语句② */
默认为int型
test()
{
return 1;
}
int main()
{
printf("%d\n", test()); //结果输出1
return 0;
}
①a<<1: a的二进制左移1位
②>>: 右移
4.运算符优先级
位非~运算符>移位运算符>位与&运算符>位异或^运算符>位或|运算符
有负数参与的取余运算,如下(结果的正负取决于%前的那个数)
printf("%d\n", -123%10); //结果:-3
printf("%d\n", 123%(-10)); //结果:3
printf("%d\n", -123%(-10)); //结果:-3
(输出时用%.0f就可以假装int了)
//以下求 n! 的函数可以正确计算21!
_______ fact(int n)
{
int i;
_______ product; //应是double,而不是int
product = 1;
for (i = 1; i <= n; i++){
product = product * i;
}
return product;
}
long long i;
scanf("%lld", &i);
printf("%lld", i);
要求:计算交错序列 1-2/3+3/5-4/7+5/9-6/11+… 的前N项之和
int n;
double factor=1.0; //通过控制正负的变量转换类型
double sum = 0;
scanf("%d", &n);
for ( int i=1; i<=n; i++ ){
sum += factor * i / (2*i-1); //也可以另外乘一个1.0
factor = -factor;
}
printf("%.3f", sum);
int day, month, year;
scanf("%d-%d-%d", &month, &day, &year);
printf("%d-%02d-%02d", year, month, day);
int k1, k2, k3;
//输入,但是八进制和十六进制输入时,数字/字母前不需要加0/0x
scanf("%d %o %x", &k1, &k2, &k3);
//输出,需要额外输出0/0x
printf("k1=%d,k2=0%o,k3=0x%x\n",k1,k2,k3);
—— 返回值是double
int i = 4;
printf("pow(2,%d) = %.0f\n", i, pow(2,i)); //int可以自动转换成double
//但是要小心pow的返回值必须是double