c语言有三种结构 顺序 选择 循环
选择结构
if语句
语法形式
if(表达式)
语句
表达式为真 执行 为假 不执行
if...else...语句
if(表达式)
语句一
else
语句二
eg:输入一个整数,判断是否为奇数
int main()
{
int num = 0;
scanf("%d", & num);
if (num % 2 == 1)
printf("%d是奇数", num);
else
printf("%d是偶数", num);
return 0;
}
eg2:输入一个年龄,>=18就输出:成年,否则就输出:未成年
int main()
{
int age = 0;
scanf("%d", &age);
if (age >= 18)//只控制离他最近的那条
printf("成年");//if只控制这条
//printf("谈恋爱");//不控制这条
else
printf("未成年");
//printf("不能谈恋爱");//if语句默认只控制一条
//if或else如果想控制多条 用大括号括起来
return 0;
}
嵌套if
例:
int main()
{
int num = 0;
scanf("%d", &num);
if (num == 0)
printf("输入的数字是0\n");
else if (num < 0) //这个if和下面的else是在上面的else里的
printf("这里的数字是负数");
else
printf("这里的数字是正数");
return 0;
}
int main()
{
int a = 0;
scanf("%d", &a);
if (a > 0)
{
if (a % 2 == 0)
printf("偶数\n");
else
printf("奇数\n");
}
else
printf("非正数\n");
return 0;
}
int main()
{
int age = 0;
scanf("%d", &age);
if (age < 18)
printf("少年\n");
else
{
if (age <= 44)
printf("青年\n");
else
{
if (age <= 59)
printf("中老年\n");
else
{
if (age <= 89)
printf("老年\n");
else
printf("老寿星\n");
}
}
}
return 0;
}
或者大括号都去掉
悬空else问题
如果有多个if和else,else总是和最近的if相匹配
关系操作符
> < >= <= == !=不相等
关系表达式返回的结果为0或1 真1假0
int main()
{
int a = (2 == 2);
printf("%d",a);//1
return 0;
}
int main()
{
int a = (2 == 3);
printf("%d", a);//0
return 0;
}
不要把相等写成赋值
如果一个变量和一个常量比较相等,建议将常量放在==的左边
多个关系操作符不能连用
int main()
{
int x = 10;
int y = 6;
int z = 14;
if (x < y < z)//x<y假 为零 零<z 故打印
//正确写法 x<y && y<z
//&&并且
printf("hehe\n");
return 0;
}
条件操作符(三目操作符) exp1 ? exp2 : exp3
先执行表达式1
真-----表达式2计算,表达式3不计算,表达式2的结果是整个表达式结果
假-----同上 2 3 互换
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
if (a > 5)
b = 3;
else
b = -3;
//b = (a > 5 ? 3 : -3);
printf("%d\n", b);
return 0;
}
逻辑操作符
!逻辑取反运算符 a=1 !a=0
int main()
{
int flag = 0;
if (!flag)
printf("hehe\n");
return 0;
}
&&与(并且)
||或(或者) 双目操作符 可以多个连用
闰年的判断
int main()
{
int year = 0;
scanf("%d", &year);
if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0))
printf("闰年");
return 0;
}
短路
如果左边的表达式满足逻辑运算符的条件 就不再对后面的表达式求值
短路求值 只看左边的表达式就能知道整个表达式的结果
switch语句
一种特殊的if...else结构
switch(整形表达式){(字符也可以
字符是以ASCII码形式存储的
case 1: 整形常量表达式
break;
case 2:
default
}
int main()
{
int day = 0;
scanf("%d", &day);
switch (day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("工作日");
break;
case 6:
case 7:
printf("休息日");
break;
default:
printf("输入错误");
break;
}
return 0;
}
case与default语句间无顺序的要求
循环结构
while for do...while
if语句和while语句相似
int main()
{
//死循环
while (1)//如果为假则不执行
printf("hehe\n");
return 0;
}
打印1到10
int main()
{
int i = 1;
while (i <= 10)
{
printf("%d ", i++);
}
return 0;
}
输入一个正整数 逆序打印这个整数的每一位 / % / % / %
int main()
{
int n = 0;
scanf("%d", &n);
while (n)//得0时就停止了
{
printf("%d", n % 10);
n = n / 10;//这步得赋值!!!!!! n /= 10
}
return 0;
}
while循环比较分散
for循环 三个表达式都可以省略 表达式2如果省略则恒为真
for(表达式1;表达式2;表达式3)
语句;
///1变量初始化2循环结束条件的判断3循环变量的调整
int main()
{
int sum = 0;
for (int i = 0; i <= 100; i++)//for(i = 3; i <= 100; i += 3)省去过多的循环
{
if (i % 3 == 0)
sum += i;
}
printf("%d ", i);
return 0;
}
do
语句;
while(表达式)
循环体至少会执行一次
输入一个正整数,计算这个正整数是几位数
int main()
{
int n = 0;
scanf("%d", &n);
int m = 0;
while (n)
{
n = n / 10;
m++;
}
printf("%d", m);
return 0;
}
break的作用是跳过循环
continue 跳过本次循环continue后面的代码
int main()
{
int i = 0;
do
{
if (i == 5)
continue;
printf("%d ", i);
i++;
} while (i <= 10);
return 0;//1 2 3 4
}
循环的嵌套
打印100到200之间素数
int main()
{
int i =0;
for (i = 100; i <= 200; i ++)//优化:for (i = 101; i < 200; i += 2)
{
int flag = 1;//假设i是素数
int n = 0;
for (n = 2; n < i; n++)//优化:for (n = 2; n <= sqrt(i); n++)
//sqrt 库函数 用来开平方 头文件math.h
{
if (i % n == 0)
{
flag = 0;
break;
}
}
if(flag == 1)
{
printf("%d ", i);
//这不能加break 如果加了外面的大循环就结束了
}
}
return 0;
}
goto语句
int main()
{
printf("hehe\n");
goto flag;
printf("haha\n");//跳过了haha的打印
flag:
printf("heihei\n");
return 0;
}
int main()
{
printf("hehe\n");
printf("haha\n");
flag:
printf("heihei\n");//死循环打印heihei
goto flag;
return 0;
}
在多层循环的代码中,如果想快速跳出,使用goto很方便