C语言知识点:操作符与循环
1、6大关系运算符
==、!=、>、<、>=、<=
2、区分‘=’和‘==’!当一个变量和一个常量比较相等时,有什么需要注意的?
//程序实例
#include <stdio.h>
int main()
{
int num1, num2 = 0;
scanf("%d %d", &num1,&num2);
if (num1 == num2)
{
printf("%d %d\n", num1, num2);
printf("== 是表示相等的关系操作符。");
}
else if (num1 != num2)
{
printf("%d %d\n", num1, num2);
num1 = num2;
printf("= 是表示赋值的关系操作符。");
}
return 0;
}
//运行结果(1)
12 12
12 12
== 是表示相等的关系操作符。
//运行结果(2)
12 34
12 34
= 是表示赋值的关系操作符。
三目运算符
3、对于a ? b: c,先计算条件a,然后进行判断。如果a的值为true,计算b的值,运算结果为b的值;否则,计算c的值,运算结果为c的值。一个条件表达式绝不会既计算x,又计算y。条件运算符是右结合的,也就是说,从右向左分组计算。例如,a ? b : c ? d : e将按a ? b : (c ? d : e)执行。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int a = 1, b = 2, c = 3, d, e;
d = ((c > a) ? a : b);
e = ((c < a) ? a : b);
printf("d=%d,e=%d\n", d, e);
return 0;
}
//运算结果
d=1,e=2
逻辑操作符
4、 三大逻辑运算符有哪些?你能画出他们的真值表吗?
逻辑—与&& 逻辑—或|| 逻辑—非!
真值表:
5、 短路是什么?
C语言短路现象讲解
- 短路现象 1
表达式1 && 表达式2 && 表达式3;
分析:
只有当表达式1为真(非0)时才需要判断表达式2的值;只有表达式1和2都为真(非零)时;才需要判断表达式3的值。当表达式1为假(0),则发生短路,不执行表达式2和3,整个表达式值为0!
#include"stdio.h"
main()
{
int a,b,c,d;
a = 0;
b = 1;
c = 2;
d = a++ && b++ && (++c);
printf("a=%d b=%d c=%d d=%d\n",a,b,c,d);
}
//运算结果
> a=1 b=1 c=2 d=0
- 短路现象 2
表达式1 || 表达式2 || 表达式3;
分析:
只有表达式1为假(0)时才需要判断表达式2的值;只有表达式1和2都为假(0)时,才需要判断表达式3的值。当表达式1为真(非0),则发生短路,不执行表达式2和3,整个表达式值为1!
例如:
#include"stdio.h"
main()
{
int a,b,c,d;
a = 0;
b = 1;
c = 2;
d = a++ || b++ || (--c);
printf("a=%d b=%d c=%d d=%d\n",a,b,c,d);
}
//运算结果
> a=1 b=2 c=2 d=1
很多初学者会不明白上面例题中,单目运算符"++“的优先级要高于双目运算符,为什么程序却不会先执行”++"呢?其实这个就是表达式的计算顺序和运算符优先级的区别,在这里我来给大家讲解一下其中的问题~
运算符的优先级:只是规定操作数的结合方式,但并未说明操作数的计算顺序。
例如:a+b+c;
运算符的优先级只能限制该运算符两端的操作对象,优先级高的可以先选择它的操作数,本题中"+“为双目运算符,结合方向自左向右依次结合,所以第一个”+"优先决定它的操作数,所以该表达式等价于(a+b)+c,并不等价于a+(b+c)
操作数的计算顺序:表达式的计算顺序是未知的,是由代码决定的。在C语言中只有4个运算符被规定了操作数的计算次序:&&,||,逗号运算符(,),条件运算符( ? : )
例如:a&&b&&c;
与运算符的计算顺序自左向右依次判断,但注意 当表达式a为假(0),则发生短路,不执行表达式b和c,整个表达式值为0
综上所述:优先级的高低只能限制运算符的操作对象,但是表达式的计算顺序仍然取决于代码本身。
【switch】
6、 if-else如何改写为switch语句?
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int num1, num2 = 0;
scanf("%d %d", &num1, &num2);
if (num1 > num2)
{
printf("%d", num1);
}
else {
printf("%d", num2);
}
}
//改写后的switch语句
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int num1, num2,num = 0;
scanf("%d %d", &num1, &num2);
if (num1 > num2)
{
num = num1;
}
else {
num = num2;
}
switch (num)
{
case 1:
printf("%d", num);
}
return 0;
}
7、 switch后的表达式类型是什么?
在C语言中switch后面表达式可以是什么类型的都正确。 switch语句都必须遵循规则如下:只能针对基本数据类型中的整型类型使用switch,这些类型包括int、char等。 对于其他类型,则必须使用if语句。
8、case后面值的类型是什么?(注意case和值之间一定要有空格)
case后面只能是整型或字符型的常量或常量表达式
还有一点就是编程的通常把执行概率较高的情况放前面
9、default?swtich的运行顺序是什么?
switch语句中default之前的case按顺序执行(首先确定是否命中case,命中case,从命中case开始执行), 最后则执行default ,如果在default 之后没有break,则继续执行default之后的语句,直到跳出switch。
【循环语句】
10、 while和if语句很相似? 怎么区分?
while语句属于循环语句,在判断是,如果条件为true,则会继续判断,直到false为止,即会进行多次判断(除非一开始条件就是错的) if语句属于条件判断语句,如果条件是true,则继续执行,为false则跳出语句不执行,只会进行单次判断
while与if语句的最大的相同点是都有至少一步的判断。 最大的不同点是:IF语句运行完毕后,接着运行下面的语句。而While中的执行语句运行完毕后,还要进行继续判断条件是否符合循环条件,根据判断的条件,返回执行语句或继续运行下面的程序。
11、 while的执行流程?
语法格式
while(条件表达式){
循环体语句;
步长语句(控制体语句);
}
class SumDemo{
public static void main(String[] args){
int i = 1; //while循环条件语句在while循环之前进行变量初始化
int sum = 0; //这是声明一个存放1-100之和的变量
while(i <= 100){
sum += i; //进行累加
}
System.out.println("1-100之和为 : " + sum); // 对结果进行控制台打印
}
}
1. 先判断条件表达式,如果结果为true,则先执行循环体语句,然后进行步长语句(控制体语句)进行执行.
2. 如果条件表达式结果为false,则退出循环.
3. 执行完毕,退出循环
12、 如何实现逆序打印一个正整数?
#include <stdio.h>
int main()
{
int x;
int result = 0;
printf("请输入一个整数:");
scanf("%d",&x);
while(x != 0)
{
result = result*10 + x%10;
x = x/10;
}
printf("%d",result);
printf("\n"); //换行
return 0;
}
测试的结果:
输入:501 , 输出:105
输入:521 , 输出:125
输入:025 , 输出:52 //注意,我们说的整数025其实就是25,所以逆序输出之后是52
输入:520 , 输出:25
13、 for循环后括号内三个表达式的作用及其执行顺序?(注意之间用分号隔开)
首先执行表达式1(一般为初始化语句,只执行一次),再执行表达式2(条件判断语句),判断表达式2的条件,如果符合,则执行表达式4,最后执行3。 如果判断2不符合,则停止执行,且不会执行表达式3.
14、 do-while和while的区别?
while是最基本的循环,它的结构为:
while( ①条件表达式 ) {
② //循环内容
}
只要①中的条件表达式一直成立,②中的代码就会一直执行
public class Test {
public static void main(String args[]) {
int x = 10;
while( x < 20 ) {
System.out.print("value of x : " + x );
x++;
System.out.print("\n");
}
}
}
do…while 循环
对于 while 语句而言,如果不满足条件,则不能进入循环。但有时候我们需要即使不满足条件,也至少执行一次。
do…while 循环和 while 循环相似,不同的是,do…while 循环至少会执行一次。
do {
② //循环内容
}while(①条件表达式);
*** 同理,只要①中的条件表达式一直成立,②中的代码就会一直执行。***
public class Test {
public static void main(String args[]){
int x = 10;
do{
System.out.print("value of x : " + x );
x++;
System.out.print("\n");
}while( x < 20 );
}
}
do…while 与while语句的区别在于:
do…while,无论是条件①是否成立,代码②一直会先执行一次。这就好比一个饿极了的客户,去餐厅吃饭,他没有先考虑自己的钱包里钱够不够买单,他总是会先去吃饭,再考虑买单。
while,他会在代码执行前先判断①条件是否成立,如果成立才会执行②代码。这就好比一个有礼貌的顾客,走进餐厅时会先检查自己口袋里钱够不够,如果钱够他才会点餐。
15、 循环体内想执行多个语句的时候怎么办?
1、创建一个for循环。
2、在循环体中添加多个语句。
3、使用缩进来表示这些语句是循环体的一部分。
4、循环体中的语句将在每次迭代时执行。
16、 break和continue的区别?
1、break用于跳出一个循环体或者完全结束一个循环,不仅可以结束其所在的循环,还可结束其外层循环。
注意:
(1)只能在循环体内和switch语句体内使用break。
(2)不管是哪种循环,一旦在循环体中遇到break,系统将完全结束循环,开始执行循环之后的代码。
(3)当break出现在循环体中的switch语句体内时,起作用只是跳出该switch语句体,并不能终止循环体的执行。若想强行终止循环体的执行,可以在循环体中,但并不在switch语句中设置break语句,满足某种条件则跳出本层循环体。
2、continue语句的作用是跳过本次循环体中剩下尚未执行的语句,立即进行下一次的循环条件判定,可以理解为只是中止(跳过)本次循环,接着开始下一次循环。
注意:
(1)continue语句并没有使整个循环终止。
(2)continue 只能在循环语句中使用,即只能在 for、while 和 do…while 语句中使用。
17、 if可以直接用break和continue吗?在switch里可以应用吗?
*** 1、如果if-else在循环体中就可以使用,break语句和continue语句跳出整体循环和继续下一轮循环 2、如果if-else不在循环体中,则不能使用break,continue,但是又想不继续执行下去的话,可以使用 return结束。***
1、break 用来退出 switch,continue 本身是不能用在 switch 里的,他必须结合循环来用,表示跳过本次循环