目录
1 取模符号+自增问题
我们不妨尝试写这样的程序
#include<stdio.h>
int main()
{
int n,t=5;
printf("%d\n",7%(-3));//1
printf("%d\n",(-7)%3);//-1
while(--t)
printf("%d\n",t);
t=5;
while(t--)
printf("%d\n",t);
return 0;
}
运行结果如下:
第一个运行结果为1, 第二个运行结果为-1,说明取模运算的符号取决于被除数
i++代表先判断之后再+1,++i代表+1之后再进行判断
所以第一个循环打印到1就结束了,第二个循环还能够打印0
例题1:
首先明确:y--这种自减是先判断表达式是否成立之后再-1
推导过程:
1.y=2进入循环,判断while循环条件成立(2!=-1),然后y=2-1=1,进入dowhile循环,a=1*1=1,a=1+1=2,判断dowhile循环条件成立(1!=0),然后y=1-1=0,进入下一次循环
2.y=0,a=3进入循环,判断while循环条件成立(0!=-1),进入dowhile循环,a=1*0=0,a=0+1=1,判断dowhile循环条件不成立(0!=0),跳出dowhile循环
3.y=-1,判断while循环条件不成立(-1!=-1),结束while循环
我的测试:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int y,a;
y=2;
a=1;
while(y--!=-1)
{
cout<<"y="<<y<<endl;
do
{
a*=y;
cout<<"a="<<a<<endl;
a++;
cout<<"a="<<a<<endl;
}while(y--);
cout<<"y="<<y<<endl;
}
printf("%d,%d",a,y);
return 0;
}
可以对照着输出值来理解
例题2:
简单来说,a[1]和a[4]进行了一次交换,a[2]和a[3]进行了两次交换(等价于没交换)
2 ~scanf问题
~是按位取反
scanf的返回值是输入值的个数
如果没有输入值就是返回-1
-1按位取反结果是0
while(~scanf("%d", &n))就是当输入EOF的时候退出循环
3 if else问题
不要因为格式的问题而被误导!!
没有括号说明else和上一行的if是紧紧关联的
所以,当x>0时,y=1;当x<0时,y=0;当x=0时,y=-1
当x>0时,y=1;当x=0时,y=-1;当x<0时,y=0
例:
ABDif内包含3条语句,C只能 包含一条语句
4 Switch case 问题
用一道例题解释如何解决case后面不能跟范围的问题:
输入分数(百分制),对应分数段输出等级,85分以上输出A,70-84分输出B,60-69分输出C,剩下输出D,要求运用Switch case语句
问题1:如何避免范围问题
解答1:可以把分数转换成10分制,10分对应100分,9分对应90-99分,8分对应80-89分。。。。。。
问题2:如何解决85分为边界的问题
解答2:可以把85-89之间的分数在转换成10分制前提高5分,这样85-89之间的数字变成90-94分就好处理了
代码:
#include <stdio.h>
int main()
{
int score;
scanf("%d",&score);
if(score<0||score>100)
{
printf("enter data error");
}
else
{
if(score>=85&&score<=100)
{
score+=5;
}
int score2=score/10;
switch(score2)
{
case 10:printf("A"); break;
case 9:printf("A"); break;
case 8:printf("B"); break;
case 7:printf("B"); break;
case 6:printf("C"); break;
default:printf("D"); break;
}
}
return 0;
}
5 if返回值问题
如果为真,则返回1
如果为假,则返回0
例1:
5>3 为真,所以返回1
1>1 为假,所以返回0
所以if条件不成立,执行else
例2:
y先被赋值为50,然后再和z比较,发现成立,所以执行if语句
例3:
x=10已经成立,不需要看后面的语句,所以y不被重新赋值,所以执行if语句
6 浮点数精度问题
#include <stdio.h>
#include <math.h>
int main()
{
double a,b,c,delta,x1,x2,realpart,imagpart;
scanf("%lf%lf%lf",&a,&b,&c);
printf("The equation:");
if(fabs(a)<=1e-6) printf("is not a quadratic\n");
else
{
delta=b*b-4*a*c;
if(fabs(delta)<=1e-6) printf("has two equal roots:%8.4f\n",-b/(2*a));
else
{
if(delta>1e-6)
{
x1=-b+sqrt(delta)/(2*a);
x2=-b-sqrt(delta)/(2*a);
printf("has distinct real roots:%8.4f and %8.4f\n",x1,x2);
}
else
{
realpart=-b/(2*a);
imagpart=sqrt(-delta)/(2*a);
printf("has complex roots:\n");
printf("%8.4f+%8.4fi\n",realpart,imagpart);
printf("%8.4f-%8.4fi\n",realpart,imagpart);
}
}
}
return 0;
}
7 变量初始化问题
例题1:
最终输出a[2],a[2]初始化为0,所以输出0
例题2:
s[1]没有初始化,不能确定k的值
强调:不同的编译器对于未初始化的值的默认赋值情况有差异,建议在初始化时不要偷懒