文档章节

C和指针---第四章:语句

fzyz_sb
 fzyz_sb
发布于 2013/09/14 11:28
字数 1292
阅读 69
收藏 0
点赞 0
评论 0

4.1 空语句

空语句:本身只包含一个分号,适用的场合就是语法要求出现一条完整的语句,但并不需要它执行任何任务。

4.2 表达式语句

C语言中并没有专门的“赋值语句”,而是通过表达式语句进行的。

x = y + 3;
ch = getchar();
表达式语句单独存在也是合法的:
y + 3;
x++;
4.3 代码块

代码块就是位于一对花括号之内的可选的声明和语句列表,可以用于要求出现语句的地方,它允许你在语法要求只出现一条语句的地方使用多条语句(for循环内)。代码块还允许你把数据的声明非常靠近它所使用的地方。例如,下面的代码是非法的:

#include <stdio.h>

int main(void)
{
	int a = 5;
	printf("hello world\n");
	int b = 7;

	return 0;
}
而下面的代码则是合法的:
#include <stdio.h>

int main(void)
{
	int a = 5;
	printf("hello world\n");
	{
		int b = 7;
	}

	return 0;
}
4.5 while语句

4.5.1 break和continue语句

在while循环中可以使用break语句,用于永久终止循环。在执行break语句后,执行流下一条执行的语句就是循环正常结束后应该执行的那条语句。

在while循环中也可以使用continue语句,它用于永久终止当前的那次循环。在执行continue语句之后,执行流接下来就是重新测试表达式的值,决定是否继续执行循环。

这两条语句的任何一条如果出现于嵌套的循环内部,它只对最内层的循环起作用,无法影响到最外层循环的执行。

4.9 goto语句

原则:坚决不用goto语句

在多层嵌套的循环中,goto语句起到一定的作用:

while (){
	while (){
		while (){
			if (){
				goto quit;
			}
		}
	}
}
quit: ;
有两个方法来避免这种goto语句:

1. 使用状态标志,但麻烦的是在每个循环中状态标志都需要进行测试:

enum {EXIT, OK} status;
status = OK;
while (status == OK){
	while (status == OK){
		while (status == OK){
			if (){
				status = EXIT;
				break;
			}
		}
	}
}
2. 把所有的循环都放到一个单独的函数里,当灾难降临到最内层的循环时,你可以使用return语句离开这个函数。

习题:

1. 

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main(void)
{
	float number;
	float preNum = 1.0;
	float curNum = 1.0;
	scanf("%f", &number);
	printf("\nthe result is:\n");
	do{
		curNum = (preNum + number / preNum) / 2.0;
	}while ((fabs(curNum - preNum) > 0.00001) && (preNum = curNum));

	printf("%.4f", curNum);

	return 0;
}

备注:

1). 要用fabs而不是用abs对浮点型的数据进行求绝对值

2).必须让表达式执行一次,所以用到do...while循环。


2. 求质数的过程,不用非常高深的技术,这属于算法题。这里就简单的编写一下如何求质数即可。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define UPPER 100
#define LOWER 1

int main(void)
{
	int i = 0;
	int j = 0;
	for ( i = LOWER; i < UPPER; i++ ){
		for ( j = i - 1; j > LOWER; j-- ){
			if (i % j == 0){
				break;
			}
		}
		if ( j == LOWER ){
			printf("%d ", i);
		}
	}

	return 0;
}
程序输出:

3. 

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int isAng( float x, float y, float z ){
	if ( ( x + y < z ) || ( x + z < y ) || ( y + z < x ) ){
		return 0;
	}

	return 1;
}

int main(void)
{
	float x;
	float y;
	float z;
	printf("please enter three number:");
	scanf("%f%f%f", &x, &y, &z);
	if ( isAng( x, y, z ) ){
		if ( (x == y) || ( x == z ) || ( y == z ) ){
			printf("等腰三角形\n");
			if ( ( x == y ) && ( y == z ) ){
				printf("等边三角形\n");
			}
		}
		else{
			printf("普通三角形");
		}
	}

	return 0;
}

程序输出:

4. 以下代码是错误的,因为字符串常量无法被更改,先粘贴出来,做个对比:

#include <stdio.h>
#include <string.h>

void copy_n( char dst[], char src[], int n ){
	int len = strlen(src);
	int i = 0;
	if (n <= len){
		for ( i = 0; i < n; i++ ){
			dst[i] = src[i];
		}
		dst[i] = '\0';
	}
	else{
		for ( i = 0; i < len; i++ ){
			dst[i] = src[i];
		}
		while ( i < n ){
			dst[i] = '\0';
			i++;
		}
	}
}

int main(void)
{
	char *dst = "hello";
	char *src = "python";


	copy_n( dst, src, 6 );
	printf("%s\n", dst);

	copy_n( dst, src, 4 );
	printf("%s\n", dst);

	return 0;
}

因为字符串常量无法改变,所以只能用字符数组:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAXLINE 128

void copy_n(char dst[], char src[], int n){
	int len = strlen(src);
	if ( n <= len ){
		while ( n-- ){
			*dst++ = *src++;
		}
		*dst = '\0';
	}
	else{
		while ( *dst++ = *src++ ){
			;
		}
		while ( len <= n ){
			*dst++ = '\0';
		}
	}
}

int main(void)
{
	char dst[MAXLINE];
	char src[MAXLINE];
	gets(src);

	copy_n(dst, src, 12);

	printf("%s", dst);

	return 0;
}
程序输入输出:

5. 没从文件进行读取,但原理一样:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAXLINE 128

int main(void)
{
	char	preLine[MAXLINE];
	char	curLine[MAXLINE];
	int		isSame = 0;

	while (gets(preLine) != NULL){
		if (!strcmp(preLine, curLine)){
			isSame = 1;
		}
		else{
			if (isSame){
				printf("the same line:%s\n", curLine);
				isSame = 0;
			}
			strcpy(curLine, preLine);
		}
	}

	return 0;
}
程序输出:

6. 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAXLINE 128

int substr(char dst[], char src[], int start, int len){
	int arrLen = strlen(src);
	int i = 0;
	if (start >= arrLen){
		return 0;
	}
	if (len + start >= arrLen){
		len = arrLen - start;
	}
	for ( i = 0; i < len; i++ ){
		dst[i] = src[start + i];
	}
	dst[i] = '\0';

	return i;
}

int main(void)
{
	char	dst[MAXLINE];
	char	src[MAXLINE] = {'a', 'b', 'c', 'd', 'e', '\0'};
	int		len = 0;
	len = substr( dst, src, 1 ,7 );
	printf("%s\n", dst);
	printf("%d", len);

	return 0;
}

程序输出:

7. 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAXLINE 128

void deblank( char string[] ){
	char	temp[MAXLINE];
	int		len = strlen(string);
	int		isSpace = 0;
	int		i = 0;
	int		j = 0;
	for ( i = 0; i < len; i++ ){
		if ( ' ' == string[i] ){
			isSpace = 1;
			continue;
		}
		else{
			if ( 1 == isSpace ){
				isSpace = 0;
				temp[j++] = ' ';
			}
		}
		temp[j++] = string[i];
	}
	temp[j] = '\0';
	strcpy(string, temp);
}

int main(void)
{
	char string[MAXLINE];
	while (gets(string) != NULL){
		deblank(string);
		printf("%s\n", string);
	}

	return 0;
}

程序输入输出:


© 著作权归作者所有

共有 人打赏支持
fzyz_sb
粉丝 404
博文 209
码字总数 447144
作品 0
武汉
程序员
Modern Fortran Explained学习笔记4

第三章.表达式和赋值语句 今天继续从第三章开始学习,第三章主要讲了表达式和赋值语句,其中最主要的是数组的表达和指针等概念的使用。 需要特别注意的点其实不多,主要的东西都是自动实现的...

粗衣大布裹天涯 ⋅ 2017/10/30 ⋅ 0

入职学习(2)--一个程序员的成长史(22)

看了代是雄对这几个问题的回复之后,唐师傅叫代是雄先熟悉一下办公的电脑及一些办事流程,他要找一些资料作为培训计划中的材料。 代是雄先到公司的IT网站上去逛了一下,发现上面的东西相当的...

zhouzxi ⋅ 2017/01/12 ⋅ 0

[编程语言]C陷阱与缺陷

内容摘要 作者以自己1985年在Bell实验室时发表的一篇论文为基础,结合自己的工作经验扩展成为这本对C程序员具有珍贵价值的经典著作。写作本书的出发点不是要批判C语言,而是要帮助C程序员绕过...

21gprs ⋅ 2014/05/23 ⋅ 0

阅读《C陷阱与缺陷》的知识增量

看完《C陷阱与缺陷》,忍不住要重新翻一下,记录一下与自己的惯性思维不符合的地方。记录的是知识的增量,是这几天的流量,而不是存量。 这本书是在ASCI C/C89订制之前写的,有些地方有疏漏。...

modernizr ⋅ 2014/08/11 ⋅ 2

阅读《C陷阱与缺陷》的知识增量

看完《C陷阱与缺陷》,忍不住要重新翻一下,记录一下与自己的惯性思维不符合的地方。记录的是知识的增量,是这几天的流量,而不是存量。 这本书是在ASCI C/C89订制之前写的,有些地方有疏漏。...

modernizr ⋅ 2014/06/30 ⋅ 7

转:再再再论指针

  一直以来想把2005年写的《再再论指针》修改一下,因为经过了这么多年,对C/C++的理解与05年相比又有了一些进展。但公司的工作一直很忙,没有时间进行修改工作。直到10月初的长假...

IMGTN ⋅ 2012/06/20 ⋅ 1

《Beginning Linux Programming》读书笔记(四)

1, 读写空指针 先看第一种情况,printf试图访问空指针,以打印出字符串,而sprintf试图向空指针写入字符串,这时,linux会在GNU C函数库的帮助下,允许读空指针,但不允许写空指针。 复制代...

嗯哼9925 ⋅ 01/08 ⋅ 0

《数据库索引设计与优化》笔记一

《数据库索引设计与优化》笔记一 码蜂笔记2017-09-289 阅读 索引数据库 第二章 表和索引结构 索引页和表页 目前页的大小一般是 或 的。页的大小决定了一个页可以存储多少个索引行、表行,以及...

码蜂笔记 ⋅ 2017/09/28 ⋅ 0

Oracle数据库学习的福利来啦——最佳入门经验分享

适用人群:从事数据库技术实施或售后工程师,准备参加OCA,OCP认证考试 通过学习对Oracle数据库的相关基础知识进行梳理,最终共同提炼出必须最先掌握的那部分知识,无论你是数据库开发、管理、...

让往事随风 ⋅ 2016/04/13 ⋅ 0

《程序员面试宝典》精华 编程语言部分

《程序员面试宝典》精华 编程语言部分 正所谓取其精华,去其糟粕。本文谨记录下《程序员面试宝典》一些关键的知识点、易错点,对于一些虽然重要但书中没有解释清楚的地方不做记录。当然这里的...

modernizr ⋅ 2014/08/11 ⋅ 2

没有更多内容

加载失败,请刷新页面

加载更多

下一页

从 Confluence 5.3 及其早期版本中恢复空间

如果你需要从 Confluence 5.3 及其早期版本中的导出文件恢复到晚于 Confluence 5.3 的 Confluence 中的话。你可以使用临时的 Confluence 空间安装,然后将这个 Confluence 安装实例升级到你现...

honeymose ⋅ 今天 ⋅ 0

用ZBLOG2.3博客写读书笔记网站能创造今日头条的辉煌吗?

最近两年,著名的自媒体网站今日头条可以说是火得一塌糊涂,虽然从目前来看也遇到了一点瓶颈,毕竟发展到了一定的规模,继续增长就更加难了,但如今的今日头条规模和流量已经非常大了。 我们...

原创小博客 ⋅ 今天 ⋅ 0

MyBatis四大核心概念

本文讲解 MyBatis 四大核心概念(SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession、Mapper)。 MyBatis 作为互联网数据库映射工具界的“上古神器”,训有四大“神兽”,谓之:Sql...

waylau ⋅ 今天 ⋅ 0

以太坊java开发包web3j简介

web3j(org.web3j)是Java版本的以太坊JSON RPC接口协议封装实现,如果需要将你的Java应用或安卓应用接入以太坊,或者希望用java开发一个钱包应用,那么用web3j就对了。 web3j的功能相当完整...

汇智网教程 ⋅ 今天 ⋅ 0

2个线程交替打印100以内的数字

重点提示: 线程的本质上只是一个壳子,真正的逻辑其实在“竞态条件”中。 举个例子,比如本题中的打印,那么在竞态条件中,我只需要一个方法即可; 假如我的需求是2个线程,一个+1,一个-1,...

Germmy ⋅ 今天 ⋅ 0

Springboot2 之 Spring Data Redis 实现消息队列——发布/订阅模式

一般来说,消息队列有两种场景,一种是发布者订阅者模式,一种是生产者消费者模式,这里利用redis消息“发布/订阅”来简单实现订阅者模式。 实现之前先过过 redis 发布订阅的一些基础概念和操...

Simonton ⋅ 今天 ⋅ 0

error:Could not find gradle

一.更新Android Studio后打开Project,报如下错误: Error: Could not find com.android.tools.build:gradle:2.2.1. Searched in the following locations: file:/D:/software/android/andro......

Yao--靠自己 ⋅ 昨天 ⋅ 0

Spring boot 项目打包及引入本地jar包

Spring Boot 项目打包以及引入本地Jar包 [TOC] 上篇文章提到 Maven 项目添加本地jar包的三种方式 ,本篇文章记录下在实际项目中的应用。 spring boot 打包方式 我们知道,传统应用可以将程序...

Os_yxguang ⋅ 昨天 ⋅ 0

常见数据结构(二)-树(二叉树,红黑树,B树)

本文介绍数据结构中几种常见的树:二分查找树,2-3树,红黑树,B树 写在前面 本文所有图片均截图自coursera上普林斯顿的课程《Algorithms, Part I》中的Slides 相关命题的证明可参考《算法(第...

浮躁的码农 ⋅ 昨天 ⋅ 0

android -------- 混淆打包报错 (warning - InnerClass ...)

最近做Android混淆打包遇到一些问题,Android Sdutio 3.1 版本打包的 错误如下: Android studio warning - InnerClass annotations are missing corresponding EnclosingMember annotation......

切切歆语 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部