c语言之选择语句

 尽管C语言有许多运算符、但是它所拥有的语句相对较少。根据对语句执行顺序的影响,C语言的其余语句大多属于以下3类。
1.选择语句( secteo stemenrm)。 if语句和svitch语句允许程序在一-组可选项中选择一条待定的执行路径。
2.重复语句(iteration statement)。 while语句、do语句和for语句支持重复(循环)操作。
3.跳转语句(jump statement),。break 语句、continue 语句和goto语句导致无条件地跳转到程序中的某个位置。( return语句也属于此类。)
C语言还有其他两类语句,一类是复合语句(把几条语句组合成一条语句)、一类是空语句(不执行任何操作)。

1.逻辑表达式

包括if语句在内的某些C证句必便测试表达式的值是“真”还是“假”。例如,if语句能需要检测表达

式ii<j .若取得真值则说明i小于j在许多编程语言中,类似i <j这样的表达式都具有特殊的“布尔”类

型成“逻辑”类型。这样的类型只有两个值,即假和真。有行C通言中1 ;这样的比较运算会产生整数:

0(假)成1(真)。

1.1关系运算符

关系运算符是用于比较两个值之间的关系的符号,包括以下符号:

  1. 等于(==):用于检查两个值是否相等。

  2. 不等于(!=):用于检查两个值是否不相等。

  3. 大于(>):用于检查一个值是否大于另一个值。

  4. 小于(<):用于检查一个值是否小于另一个值。

  5. 大于等于(>=):用于检查一个值是否大于或等于另一个值。

  6. 小于等于(<=):用于检查一个值是否小于或等于另一个值。

这些运算符通常用于条件语句和循环语句中,帮助程序根据不同条件执行不同的操作。

注意:1.关系运算符的优先级低于算术运算符。例如,表达式i+j< k-1意思是(i+j)<(k一1)。关系运算符都是左结合的。

2.表达式i<j<k在C语言中是合法的,但可能不是你所期望的含义。因为<运算符是左结合的,所以这个表达式等价于
(i<j)<k
换句话说,表达式首先检测i是否小于j,然后用比较后产生的结果(1或0)来和k进行比较。这个表达式并不是测试j是否位于i和k之间。

1.2判等运算符

判等运算符(equality operator)用于比较两个值是否相等,通常用于条件语句和循环语句中的判断条件。常见的判等运算符包括:

  1. 相等运算符(==):检查两个值是否相等,如果相等则返回 true,否则返回 false。

例如:5 == 5 返回 true;"hello" == "world" 返回 false。

  1. 不相等运算符(!=):检查两个值是否不相等,如果不相等则返回 true,否则返回 false。

例如:5 != 3 返回 true;"hello" != "hello" 返回 false。

需要注意的是,判等运算符只能用于比较基本数据类型,如数字、字符串等。当需要比较引用类型时,需要使用其他方式,如比较对象的引用地址或者比较对象的某个属性值。

1.3逻辑运算符

逻辑运算符是用来连接和操作两个或多个逻辑表达式的运算符,常见的逻辑运算符有以下三种:

  1. 与运算符(&&):表示两个逻辑表达式都为真时,整个表达式才为真。

  2. 或运算符(||):表示两个逻辑表达式中至少有一个为真时,整个表达式才为真。

  3. 非运算符(!):表示对一个逻辑表达式取反,如果原表达式为真,则取反后为假,反之亦然。

逻辑运算符通常用于判断条件语句和循环语句中,可以通过它们来进行多个逻辑表达式的组合和判断,以实现程序的逻辑控制。

逻辑运算符所产生的结果是0或1。操作数的值经常是0或1,但这不是必需的。逻辑运算符将任何非零值操作数作为真值来处理,同时将任何零值操作数作为假值来处理。
逻辑运算符的操作如下:
1.如果表达式的值为0,那么!表达式的结果为1;
2.如果表达式1和表达式2的值都是非零值,那么表达式1&表达式2的结果为1;
3.如果表达式1或表达式2的值中任意 一个是(或者两者都是)非零值,那么表达式1||表达式2的结果为1。

逻辑运算符的短路

在进行逻辑运算时,如果运算的结果可以根据其中的某一个运算数就能够确定,则不会再去判断其他的运算数。这使得逻辑运算得以加速。

例如,在使用逻辑运算符 && 进行逻辑运算时,如果第一个运算数为 false,则表达式的结果一定为 false,因此不会去判断第二个运算数。同样,在使用逻辑运算符 || 进行逻辑运算时,如果第一个运算数为 true,则表达式的结果一定为 true,因此不会去判断第二个运算数。

逻辑运算符的短路在编程中非常常见,可以用于提高程序的效率和性能。但需要注意的是,这种优化方法可能会影响程序的正确性,因此在实际编程中需要谨慎使用。

2.if语句

if语句是一种常见的条件语句,用于在程序中根据一个条件来选择性地执行特定的一段代码。if语句的一般形式如下:

if (condition) {
  // code to be executed if condition is true
}

其中,condition是一个布尔表达式,如果评估为true,就执行花括号中的代码块。如果condition评估为false,则跳过该代码块,继续执行后面的代码。

除了最基本的if语句之外,还有一些其他的变体,例如:

if (condition) {
  // code to be executed if condition is true
} else {
  // code to be executed if condition is false
}

这是一个if-else语句,它允许在条件为false时执行一段备用代码块。

还有if-else-if语句,它允许测试多个条件,并根据条件的不同执行不同的代码块:

if (condition1) {
  // code to be executed if condition1 is true
} else if (condition2) {
  // code to be executed if condition2 is true
} else {
  // code to be executed if all conditions are false
}

在此示例中,如果condition1评估为true,则执行第一个代码块,如果condition1为false但condition2为true,则执行第二个代码块,否则执行最后一个代码块。

2.1复合语句

复合语句指由多个语句组成的语句块,它们被大括号{}包围起来,使用复合语句可以使一组语句被视为一个整体,可以在条件控制语句、循环语句和函数定义中使用。例如:

if (condition) {
    // 如果条件为真,执行以下语句
    statement1;
    statement2;
}

在上面的代码中,大括号中的语句组成了一个复合语句,如果条件为真,那么其中的语句将被执行。同样,循环语句也可以使用复合语句:

for (int i = 0; i < 10; i++) {
    // 重复执行以下语句10次
    statement1;
    statement2;
}

在上面的代码中,循环体中的语句也组成了一个复合语句。除此之外,在函数定义中,函数体也是一个复合语句:

void myFunction() {
    // 函数体
    statement1;
    statement2;
}

在上面的代码中,函数体也被视为一个复合语句,其中的语句将在函数被调用时执行。

2.2else语句

else语句在条件语句(如if语句)的后面,用来执行在条件不满足时的代码块。如果if语句的条件不成立,则执行else语句中的代码。通常,else语句是可选的,可以在if语句的后面直接跟上一个结束符号(如分号),表示if语句后面没有需要执行的语句。

以下是一个示例代码,展示了if-else语句的使用:

x = 5
if x > 10:
    print("x大于10")
else:
    print("x小于等于10")

在上述代码中,如果x的值大于10,则打印“x大于10”,否则打印“x小于等于10”。因为x的值为5,所以输出结果为“x小于等于10”。

C语言可以出现在if语句内部的if语句类型没有限制,事实上if语句内部嵌套,其他if语句已经非常的普遍。如下例:
找出i,j, k中所存储的最大值并将其保存到max中:

#include <stdio.h>
int main()
{
	int i, j, k,max;
	scanf_s("%d %d %d", &i, &j, &k);
	if(i>j)
	if (i > k)
		max = i;
	else
		max = k;
	else  if(j>k)
		  max = j;
	  else
		  max = k;
	printf("max=%d", max);
	return 0;
	
}

语句可以嵌套任意层。 注意,把每个else同与它匹配的If对齐排列,这样做很容易辩
别嵌套层次。如果发现嵌套仍然很混乱,那么不要犹像,直接增加花括号就可以了:
 

#include <stdio.h>
int main()
{
	int i, j, k,max;
	scanf_s("%d %d %d", &i, &j, &k);
	if (i > j) {
		if (i > k)
			max = i;
		else
			max = k;
	}
	else {
		if (j > k)
			max = j;
		else
			max = k;
	}
	printf("max=%d", max);
	return 0;
	
}

多数的程序员在if语句以及重复语中尽可能多的增加花括号以更好他管理的程序,为每个if语句和else语句都增加了一对花括号。
即便在不必要的情况下也使用花括号,这样做有两个好处。首先,由于很容易添加更多的语句到任何if或else子句中,程序变得更容易修改;其次,这样做可以在向if或else子句中增加语句时避免由于忘记使用花括号而导致错误。

2.3级联式if语句

级联式if语句也被称为嵌套式if语句,是指在一个if语句中嵌套另一个if语句。其基本结构如下:

if condition1:
    # do something
    if condition2:
        # do something
    elif condition3:
        # do something
    else:
        # do something
else:
    # do something

其中,condition1是最外层的判断条件,如果它为真,则执行内部的if语句块。如果condition2为真,则执行内部的第一个代码块;如果condition3为真,则执行内部的第二个代码块;如果都不为真,则执行内部的else代码块。如果condition1为假,则执行外部的else代码块。

级联式if语句的优点在于可以根据需要嵌套多个if语句来实现复杂的逻辑判断;缺点在于嵌套过深会使程序变得难以理解和维护,也会影响代码的可读性和执行效率。因此,在写代码时应该尽量避免嵌套过深的if语句块。

典型级联式if语句

以下是一个简单的C程序,用于计算股票基金人的佣金

#include <stdio.h>

int main() {
    float commission, value;

    printf("Enter value of trade: ");
    scanf("%f", &value);

    if (value < 2500.00f) {
        commission = 30.00f + 0.017f * value;
    } else if (value < 6250.00f) {
        commission = 56.00f + 0.0066f * value;
    } else if (value < 20000.00f) {
        commission = 76.00f + 0.0034f * value;
    } else if (value < 50000.00f) {
        commission = 100.00f + 0.0022f * value;
    } else if (value < 500000.00f) {
        commission = 155.00f + 0.0011f * value;
    } else {
        commission = 255.00f + 0.0009f * value;
    }

    if (commission < 39.00f) {
        commission = 39.00f; // 最低佣金
    }

    printf("Commission: $%.2f\n", commission);

    return 0;
}

该程序要求用户输入交易的价值,然后根据不同的交易价值计算出佣金。佣金的计算方式如下:

  • 当交易价值小于2500美元时,佣金为30美元加上交易金额的1.7%。
  • 当交易价值介于2500美元和6250美元之间(包括两端)时,佣金为56美元加上交易金额的0.66%。
  • 当交易价值介于6250美元和20000美元之间(包括两端)时,佣金为76美元加上交易金额的0.34%。
  • 当交易价值介于20000美元和50000美元之间(包括两端)时,佣金为100美元加上交易金额的0.22%。
  • 当交易价值介于50000美元和500000美元之间(包括两端)时,佣金为155美元加上交易金额的0.11%。
  • 当交易价值超过500000美元时,佣金为255美元加上交易金额的0.09%。

程序还检查佣金是否低于最低佣金(39美元),如果低于最低佣金则将佣金设为最低佣金。最后程序输出计算出的佣金值。

2.4悬空else问题

在编程中,一个if语句(或其他条件语句)后面可以跟着一个else语句,它在条件表达式为false时执行另一段代码。但是,有时候会出现悬空else问题,即else语句没有与之对应的if语句。

这种情况可能是因为在编写代码时出现了语法错误,或者是复制粘贴代码时意外复制了一个else语句。可以通过检查代码中所有条件语句及其对应的代码块来解决这个问题,或者使用代码编辑器中的语法检查工具来帮助找到悬空else语句并修复它们。

以下是一个悬空else问题的例子:

if (x > 5) {
   if (y > 10) {
      System.out.println("x is greater than 5 and y is greater than 10");
   }
} else {
   System.out.println("x is less than or equal to 5");
}

在上述代码中,如果 x 小于或等于 5,则不会打印任何内容,这是因为 else 语句与第一个 if 语句悬挂。应该将 else 语句与第二个 if 语句绑定才正确。修正后的代码如下:

if (x > 5) {
   if (y > 10) {
      System.out.println("x is greater than 5 and y is greater than 10");
   } else {
      System.out.println("y is less than or equal to 10");
   }
} else {
   System.out.println("x is less than or equal to 5");
}

3.条件表达式

条件表达式是一种编程语言中的表达式,它用于测试某种条件并根据条件的结果产生不同的行为。条件表达式通常涉及到以下三个部分:

  1. 条件:一个布尔值(true或false),它指示需要测试的某个条件是否满足。

  2. 真结果:一个表达式或值,表示如果条件满足,将要执行的代码或返回的值。

  3. 假结果:一个表达式或值,表示如果条件不满足,将要执行的代码或返回的值。

C语言条件表达式是一种三元运算符,也称为条件运算符(?:)。它的语法如下:

expression1 ? expression2 : expression3;

其中,expression1是一个表达式,它的结果为真或假;如果结果为真,则整个条件表达式的值为expression2的值;如果结果为假,则整个条件表达式的值为expression3的值。

例如,下面的代码使用条件表达式计算两个整数的最大值:

int a = 10, b = 20;
int max = (a > b) ? a : b;

在这个例子中,如果a大于b,则max的值为a,否则max的值为b。

4.switch语句

switch语句是一种条件语句,用于根据给定的值(表达式)执行不同的操作。它的基本语法如下:

switch (表达式) {
  case 值1:
    // 执行代码块1
    break;
  case 值2:
    // 执行代码块2
    break;
  ...
  default:
    // 如果表达式的值不等于任何一种情况,则执行此代码块
    break;
}

switch语句将根据表达式的值来执行与之对应的代码块。如果表达式的值与某个case后面跟着的值相等,则执行该case后面的代码块。如果表达式的值不等于所有case后面的值,则执行default后面的代码块(如果有的话)。每个代码块都必须以break语句结束,否则程序将继续执行下一个case后面的代码块,直到遇到break语句为止。

1.控制表达式。switch后边必须跟着由圆括号括起来的整型表达式。C语言把字符当成整数来处理,因此在switch语句中可以对字符进行判定。但是,这不适用于浮点数和字符串。
2.分支标号。每个分支的开头都有一个标号,格式如下:
case常量表达式:
常量表达式( constant expression )很像普通的表达式,只是不能包含变量和函数调用。因此,5是常量表达式,5 + 10也是常量表达式,但n + 10不是常量表达式(除非n是表示常量的宏)。分支标号中常量表达式的值必须是整数(字符也可以)。
3.语句。每个分支标号的后边可以跟任意数量的语句,并且不需要用花括号把这些语句括起来。每组语句的最后一条通常是break语句。

5.break作用

break是C语言中的一种关键字,用于中断一个循环或switch语句。

在循环中,程序会一直执行循环体内的语句,直到循环条件不成立或者遇到break语句时才会结束循环。例如:

int i;
for (i = 1; i <= 10; i++) {
  if (i == 5) {
    break;  // 中断循环
  }
  printf("%d\n", i);
}

上述代码会在i等于5时中断循环,因此只会输出1、2、3、4四个数字。

在switch语句中,每个case分支通常会以break结束,以避免程序执行到下一个分支。例如:

int a = 1;
switch (a) {
  case 1:
    printf("a is 1\n");
    break;  // 结束switch语句
  case 2:
    printf("a is 2\n");
    break;
  default:
    printf("a is other value\n");
}

在上面的代码中,由于a的值为1,会执行第一个case分支,打印出"a is 1"。由于有break语句,程序会跳出switch语句,不会执行后面的分支。

经典案例,显示法定格式的日期

英文合同和其他法律文档中经常使用下列日期格式:
Dated this_____dayof ____ , 20____
下面编写程序,川这种格式来品示英文日期。用户民月日年的格式输人日期。然
显示出“法定”格式的日期:

Enter date (ma/dd/yy): 2/19/14
Dated this 19th day of July, 2014.


可以使用printf函数实现格式化的大部分工作。然而,还有两个问题:如何为日添加“th"(或者“st” "nd" “rd" ), 以及如何用单词而不是数字来显示月份。幸运的是,switch语句可以很好地解决这两个问题:我们用个switch语句显示日期的后缀,再用另一个switch语句显示出月份名。

#include <stdio.h>
int main()
{
	int month, day, year;
	printf("Enter date (mm/dd/yy):");
	scanf_s("%d /%d /%d", &month, &day, &year);
	printf("Dathed this %d", day);
	switch (day)
	{
	case 1:case 21:case 31:
		printf("st"); break;
	case 2:case 22:
		printf("nd"); break;
	case 3:case 23:
		printf("rd"); break;
	default:printf("th"); break;
		break;
	}
	printf("day of");
	switch (month)
	{
	case 1:   printf("January"); break;
	case 2:printf("February"); break;
	case 3:printf("March"); break;
	case 4:printf("April"); break;
	case 5:printf("May"); break;
	case 6:printf("June"); break; 
	case 7:printf("Jule"); break;
	case 8:printf("August"); break;
	case 9:printf("September"); break;
	case 10:printf("October"); break;
	case 11:printf("November"); break;
	case 12:printf("December"); break;
	}
	printf(",20%.2d.\n", year);
	return 0;
}

 运行结果图

Enter date (mm/dd/yy):8/21/23
Dathed this 21stday ofAugust,2023.

  • 13
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值