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)
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()读取进去了,当每次输入一个字符然后摁下回车,字符加回车符会被送到缓冲区中,然后循环读取,先输出字符,然后再输出回车,如果缓冲区没有东西,就会等待
getchar()的返回类型是int,因为读取的字符本身也是ASCII值,读取到错误或者文件结束的EOF标志本身也是-1
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;
}
}