C语言大法 第二式 语句
语句是C程序的基本构建块,一条语句相当于一条完整的计算机指令,在C中大部分语句以分号结尾
空语句
C最简单的语句就是空语句,它本身只包含一个分号,一般是为了语法要求来组成一条完整的语句
while( (ch=getchar() !=EOF )
; //这一条语句就是空语句,只需要保持循环的完整性不需要执行什么
表达式语句
表达式
表达式由运算符和运算对象组成
C表达式最重要的一个特性就是—每个表达上都有一个值
表达式的求值顺序一部分是由它所包含的操作符优先级和结合性决定的
表达式 | 值 |
---|---|
- 4 + 6 | 2 |
a = 2 + 6 | 8 |
6 > 3 | 1 |
4 + ( a = 2 + 4 ) | 10 |
比如判断的表达式( a >3 )这种表达式的值不是0就是1,如果条件为真那么就是1,
如果条件为假,表达式的值就是0.
这里的最后一个表达式[ 4 + ( a = 2 + 4 )]虽然完全合法但不建议使用.它是两个子表达式的和,每个子表达式都有值
在表达式后面加上一个分号,就将表达式转换成为语句
C语言的副作用—副作用是对数据对象或文件的修改
int a = 10;
printf("%d",a);
比如:第一条语句的副作用就是将变量a的值设置成10
调用printf函数时它的返回值我们通常不关心,它的显示作用就是其副作用
左值和右值
左值就是可以出现在赋值符号左边的东西,右值就是可以出现在赋值符号右边的数值
a = b + 25;
b + 25 = a;可以互换吗?
左值是一个表达式,可以出现在赋值符的左边,表示内存中的一个地址
右值表示一个值,它出现在赋值符的右边
每个左值表达式同时是一个右值,但右值不一定能作为左值
第一个句子:
a=b+25;a是一个左值它标定了一个存储的特定的位置,而b+25指定了一个值
第二个句子:
b+25=a;原先作为左值的a可以作为右值,但是b+25不能作为左值,
应为b+25的结果必定会保存于机器的某个位置,但是我们不能预测它
所存储的具体位置,也无法保证下次是否存储于同一位置。
同理: 字面值常量都不是左值。
复合语句
复合语句就是用花括号括起来的一条或者多条语句,复合语句也称为块
while(girlfriend==1)
{
if(不分手)
printf("有女朋友!!!");
else
girlfriend--;
}
这个{ }之间的整个语句就是一个复合语句或者一个块
分支语句
if 语句
表达式结果为真则语句执行,在C语言中非零表示真,零表示假
if 一般情况下只能控制一个语句如果想要控制多条语句则需要将语句用{ }括起来
悬空else
当if出现嵌套时就会出现“悬空else”的情况
if(a>1)
if(b>1)
printf("%d",a);
else
printf("%d",b);
这种情况else字句是从属于最靠近的的if语句也就是if(b>1)
如果想让他从属于第一个if语句那么就需要加上一条空else语句
或者用{ }将他们包围在一个代码块内部(推荐这种)
新的_Bool类型
在C语言中一直用int类型的变量表示真/假值,C99专门针对这种类型的变量新增_Bool类型,表示真或假的变量称为布尔变量,_Bool是C语言中布尔变量的类型名。
_Bool类型的变量只能存储1(真)或0(假),如果把其他非零值的数值赋值给_Bool类型的变量,该变量会被设置成1,C把所有非零值视为真。
int a = 10;
_Bool b = a>0;
if(b)
printf("真");
如果不支持_Bool类型导致程序无法进行,可以将_Bool替换成int
switch 语句
switch语句也是一种分支语句,常常用于多分支的情况
这里我们只输入1,但是我们按照顺序将全部的case语句从上而下执行了,所以我们要实现一个case进入后退出,这时候我们需要在每个case语句结尾加上break语句
case决定入口而break决定出口
case后面只能接整形比如1 2 3不能接别的比如1.0 2.0等但是可以接字符,因为字符在存储中以它的ASCll码值存放
default子句
switch()
{
case 1:
printf("one");
break;
case 2:
printf("two");
break;
default:
printf("输入错误");
break;
}
循环语句
while语句
表达式为非零也就是真的情况下进入循环,循环的测试在循环体开始执行之前进行,如果测试结果一开始为假那么循环体就不会进行
while(girlfriend == 1)
{
if(不分手)
printf("有女朋友!!");
else if(分手)
printf("失恋");
else if(又找一个)
printf("渣男!!");
}
如果while在表达式内部就能完成目标任务,那么循环就无事可做,这种情况下循环体就用空语句来表示,但最好不要在后面之间就接分号容易产生错误
while((ch = getchar()) !=EOF && ch !='\n' )
;
break 和 continue 语句
在while循环中使用break语句用于永久停止循环,在执行完break语句后下一句就是循环正常结束的下一句语句
continue语句用于永久终止当前的这次循环,执行完这次continue语句后直接重新判断表达式真假来决定是否继续循环
这两条语句如果出现在嵌套中那么只对它所处的循环内部有效,无法影响外层的循环,也就是只能退出一层循环
for语句
for(有一个女朋友;现在是否有女朋友;分手)
{
printf("不好好处对象!!");
}
这个循环只执行了一次
for循环的三个表达式都是可选的,都可以省略,如果省略判断部分,那么判断就恒为真
在for语句中使用break与continue语句,使用break语句就是直接跳出循环,
使用continue语句就直接跳到调整部分,在while语句中因为调整部分也是循环体的一部分所以continue是直接跳过
for语句的循环控制变量
不可在for 循环体内修改循环变量,防止 for 循环失去控制
for(i=0;i<10;i++)
{
i=10;
}
这种写法将会直接导致for循环终止,一般情况不可取
建议for语句的循环控制变量的取值采用“前闭后开区间”写法
int i = 0;
//前闭后开的写法
for(i=0; i<10; i++)
{}
//两边都是闭区间
for(i=0; i<=9; i++)
{}
do while 语句
do while循环是至少执行一次
int i = 10;
do
{
printf("%d\n", i);
}while(i<10);
循环是一个强大的编辑工具,在创建循环时一定要注意以下几点
- 注意循环的测试条件要能使循环结束
- 确保循环测试中的值在首次使用之前已初始化
- 确保循环在每次迭代后都更新测试的值
goto语句
理论上 goto语句是没有必要的,实践中没有goto语句也可以很容易的写出代码
最常见的goto语句就是跳出多层循环
for(...)
for(...)
{
for(...)
{
if(disaster)
goto error;
}
}
…
error:
if(disaster)//处理错误
当使用break语句达不到想要的目的就使用goto语句
goto语句只能在一个函数里面跳转,不能跨函数
如果博客里面出现错误欢迎大家留言评论
从小白到武林之巅让我们一起学好c语言大法