C语言容易忽略的问题(随时更新,更新时间:2023.3.31)

目录

1  取模符号+自增问题

2  ~scanf问题

3  if else问题

4 Switch case 问题

5  if返回值问题

6  浮点数精度问题

7  变量初始化问题


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的值

强调:不同的编译器对于未初始化的值的默认赋值情况有差异,建议在初始化时不要偷懒

猜你喜欢

转载自blog.csdn.net/m0_71934846/article/details/129242180