c primer plus 专题7:分支和跳转

1 if 语句

#include <stdio.h>

int main(void)
{
	const int FREEZING = 0;
	float temperature;
	int cool_days = 0;
	int all_days = 0;

	printf("Enter the list of daily low temperatures.\n");
	printf("Use Celsius, and enter q to quit.\n");
	while (scanf("%f", &temperature) == 1)
	{
		all_days++;
		if (temperature < FREEZING)
			cool_days++;
	}
	if (all_days != 0)
		printf("%d days total: %.1f%% were below freezing.\n",
			all_days, 100.0 * cool_days / all_days);
	else
		printf("No data entered!\n");

	return 0;
}

2 字符输入函数

getchar() 和 putchar()

#include <stdio.h>
#define SPACE	' '
int main(void)
{
	char ch;

	printf("Enter string:\n");
	while ((ch = getchar()) != '\n')
	{
		if (ch == SPACE)
			putchar(ch);
		else
			putchar(ch + 1);
	}
	printf("\nDone!\n");

	return 0;
}

执行结果如下

3 多重选择

if (expression)
	statement
else if (expression)
	statement
else if (expression)
	statement
else 
	statement

注意,if else 总是与最近的语句相匹配。

4 逻辑运算符

优先级(非常重要):! > 算术运算符 > 关系运算符 > 逻辑运算符 > 赋值运算符。

5 条件运算符

利用条件运算符,处理单复数的问题:

printf("You need %d %s of paint.\n", cans,
    cans == 1 ? "can" : "cans");

这里,利用条件运算符,来给字符串赋值(单复数)。

6 循环辅助 

1 continue 语句

使用 continue 的好处:可以减少程序的缩进。

如下所示:
 

2 break 语句(仅跳出当前层的循环)

比较 break 和 continue 语句

使用 break 的实例

#include <stdio.h>

int main(void)
{
	float length, width;

	printf("Enter the length of rectangle: \n");
	while (scanf("%f", &length) == 1)
	{
		printf("Length = %.2f:\n", length);
		printf("Enter its width:\n");
		if (scanf("%f", &width) != 1)
			break;
		printf("Width = %.2f:\n", width);
		printf("Area = %.2f:\n", length * width);
		printf("Enter the length of rectangle: \n");
	}
	printf("All done, exit!!!\n");

	return 0;
}

7 多重选择

swtich case 语句

带多重选择的 switch 语句

#include <stdio.h>

int main(void)
{
	char ch;
	int a_cnt, e_cnt, i_cnt, o_cnt, u_cnt;

	a_cnt = e_cnt = i_cnt = o_cnt = u_cnt = 0;
	
	printf("Enter some text, enter # to quit.\n");
	while ((ch = getchar()) != '#')
	{
		switch (ch)
		{
			case 'a':
			case 'A': a_cnt++;
				break;
			case 'e':
			case 'E': e_cnt++;
				break;
			case 'i':
			case 'I': i_cnt++;
				break;
			case 'o':
			case 'O': o_cnt++;
				break;
			case 'u':
			case 'U': u_cnt++;
				break;
			default:
				break;
		}
	}
	printf("total numbers:   A    E    I    O    U\n");
	printf("              %4d %4d %4d %4d %4d\n", a_cnt, e_cnt, i_cnt, o_cnt, u_cnt);
	printf("All done, exit!!!\n");

	return 0;
}

8 goto

c语言的goto语句:

goto语句的常规用法(要跳转的标签位置在上面)

#include<stdio.h>
int main(void) 
{
	int n;
pos_1:
	printf("请输入一个正整数:");
	scanf("%d", &n);
	if (n < 0)
	{
		printf("输入错误!\n");
		goto pos_1;
	}
	printf("成功输入正整数:%d\n", n);
	return 0;
}

很多C语言的参考书,都不提倡使用 goto 语句,下面是使用 goto 语句比较好的应用场景。

1 在I2C写入时,通常要等待操作完成,才能继续写入,下面是goto的使用

int Sensors_I2C_WriteRegister(unsigned char slave_addr,
                              unsigned char reg_addr,
                              unsigned short len,
                              const unsigned char *data_ptr)
{
  char retries=0;
  int ret = 0;
  unsigned short retry_in_mlsec = Get_I2C_Retry();

tryWriteAgain:
  ret = 0;
  ret = ST_Sensors_I2C_WriteRegister( slave_addr, reg_addr, len, ( unsigned char *)data_ptr);

  if(ret && retry_in_mlsec)
  {
    if( retries++ > 4 )
        return ret;

    mdelay(retry_in_mlsec);
    goto tryWriteAgain;
  }
  return ret;
}

上述程序,利用 goto 语句,尝试多次写入I2C。若 4 次仍失败,则退出。

2 函数内部使用(统一出口)

int getresult_use_goto()
{
    int iResult = 0;
 
    FILE*    fp1 = NULL;
    FILE*    fp2 = NULL;
    char*    pMem1 = NULL;
    char*    pMem2 = NULL;
     
    fp1 = fopen("C:\\file1", "rb");
    if (NULL == fp1)  goto End;
 
    fp2 = fopen("C:\\file2", "rb");
    if (NULL == fp2)  goto End;
 
    pMem1 = (char *)malloc(1000);
    if (NULL == pMem1) goto End;
 
    pMem2 = (char *)malloc(2000);
    if (NULL == pMem2) goto End;
 
    iResult = 1;
 
End:
    if (fp1) fclose(fp1);
    if (fp2) fclose(fp2);
    if (pMem1) free(pMem1);
    if (pMem2) free(pMem2);
    return iResult;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值