C语言if,while,switch注意事项

if语句判断两值是否相等

int main()
{
	int num = 5;
	if(num == 5)
	{
		printf("%d",num);
	}
	
	if(5 == num)	//推荐这种写法
	{
		printf("%d",num);
	}
    return 0;
}

当判断两个值是否相等,把常量放在左边,如果此时大意把 == 写成了 = ,编译器会直接报错,常量不能放左边,也就避免了写错

如果是num== 5,当大意把 == 写成 = ,编译器不会报错,但代码的逻辑已出现错误,不再是判断相等,而是把5赋给num

注意:

if (password == "123456"){}		//错误

两个字符串比较,不能使用==,应该使用strcmp , ==是比较两者的地址,strcmp比较字符串内容,和java的equal函数类似,根据其返回值判断两个字符串的大小:

返回0,则两者相等;返回值大于0,则第一个字符串大于第二个字符串;返回值小于0,则第一个字符串小于第二个字符串

所以上面代码应改为:

if(strcmp (password, "123456")==0)

while循环

int main()
{
	int i = 0;
	while(i <= 10)
	{
		if(i == 5)
			continue;
		printf("%d",i);
		i++;
	}
	return 0;
}

这个循环的输出结果是:1 2 3 4 (后面死循环)

因为当i == 4,执行完i++后,i == 5 ,转到while语句判断,成立进入,然后if语句判断,i==5为真,就continue,然后再回到了while判断语句,并没有执行后面的打印和i++语句,所以i 一直是5,造成死循环

在while循环中,break用于永久的终止循环,continue的作用是跳过本次循环continue后边的代码,直接去判断部分,看是否进行下一次循环


int main()
{
	int ch = 0;
	while((ch = getchar()) != EOF)		//EOF - end of file -文件结束标志
	{
		putchar(ch);
	}
	return 0;
}

输出结果:

在这里插入图片描述

解释:回车符\n也被getchar()读取进去了,当每次输入一个字符然后摁下回车,字符加回车符会被送到缓冲区中,然后循环读取,先输出字符,然后再输出回车,如果缓冲区没有东西,就会等待

C语言if,while,switch注意事项_第1张图片

getchar()的返回类型是int,因为读取的字符本身也是ASCII值,读取到错误或者文件结束的EOF标志本身也是-1


switch、case

switch允许嵌套使用

注意:

在C语言中,case语句中是不能一开始就定义变量或初始化变量的,如下面例子两种写法都是错误的

swithc(a){
    case 1:
        int b;
        b = 1;

        int b = 1;
        printf("b:%d",b);
        break;
    case 2:
    	b = 2;
        printf("b:%d",b);
        break;
}

错误提示:error: expected expression

​ int b = 1;

​ ^

意思是说,此处需要一个表达式(expression),而不是一个变量声明初始化

另一种错误提示:a label can only be part of a statenent and a declaration is not a statenent,这句话的意思是说,标签只能是statement语句的一部分,而declaration声明不是一个statement语句。

在C99标准中,case和default都是标签语句,他们后面必须得跟上statement。

解决办法:

方法一:case后面直接接上一个空语句";"之后,再定义变量

case 0:
    ;
    int m = 1;		//不会报错,也没有警告
    printf("-----------\n");
    break;

方法二:加"{ }",把case后面语句包括起来

case 0:
{
	int m = 1;
	printf("-----------\n");
    break;
}

而在C++语言中,下面在case中初始化也是不行的,报错

switch (something)
{
	case a:
		int a = 0;
		break;
}

究其根本原因,是C++的一条规则:在任何作用域内,假如存在变量初始化语句,该初始化语句不可以被跳过,一定要执行!

这里强调在作用域内的变量一旦初始化就不能跳过,但是可以跳过整个作用域!

比如初始化语句int a=0,就有虽然进入其所在的作用域,但是不被执行的风险,所以就报错了!

下面的程序是正常编译和执行的,

switch (something)
{
    case a:
        int a;
        break;
    case b:
        a= 1;
        break;
}

在C++中是正常编译和执行的,因为:int a只是定义了a,并没有初始化,没有违背上述规则!编译的时候,编译到case a的时候分配空间,编译到case b的时候赋值,a的作用域就是switch后的整个{},完全没有问题。

另外:在switch和case直接写语句,没有意义,因为它执行不到。

switch(a){
	printf("hello world\n");//该语句不会执行
	case 0:
	{
		int m=10;
		printf(" ----O----\n" );
		break;
	}
}

你可能感兴趣的:(C语言,c语言)