类型转换
混合运算中的类型转换
不同类型的数值数据 在进行混合运算时,要先转换成同一类型之后再运算。
无论是自动转换还是强制转换,都只是为了某次计算的需要 而对变量的数据长度进行的 临时性转换,并不会改变数据说明时对该变量定义的类型。
自动类型转换
不论运算对象是否为不同的类型,float 型向 double 型的转换、char 型向 int 型的转换是必定要进行的。
强制类型转换
当较低类型的数据转换为较高类型时,一般只是形式上有所改变,而不影响数据的实质内容。
当较高类型的数据转换为较低类型时,则可能伴有数据的丢失。
强制类型转换一般用于自动类型转换不能达到目的的时候。
// 华氏度转摄氏度
#include <stdio.h>
int main(int argc, char const *argv[])
{
float f, c;
scanf("%f", &f);
c = 5 / 9.0 * (f - 32); // 若用5 / 9 * (f - 32),则结果为0!!!!!
printf("%.2f\n", c);
return 0;
}
赋值中的类型转换
浮点型与整型
单、双精度浮点型
字符型与整型
int 型 与 long 型
无符号整数
#include <stdio.h>
int main(int argc, char const *argv[])
{
int a = 5;
float b = a/2;
float c = (float)a/2;
printf("%f\t%f\n",b,c); // 2.000000 2.500000
int d = 1.0f; // 把 f 改成其他字母(不包括l)会报错
printf("%d\n", d); // 1
int e = 2.6f; // 把 f 改成其他字母(不包括l)会报错
printf("%d\n", e); // 2
int g = 3.0l; // 把 l 改成其他字母(不包括f)会报错
printf("%d\n", g); // 3
int h = 4.9l; // 把 l 改成其他字母(不包括f)会报错
printf("%d\n", h); // 4
printf("%d\n", 1.0); // 0
printf("%d\n", 5.7); // ??
printf("%d\n", sizeof(1.0)); // 8, double 类型
printf("%d\n", (int)1.0); // 1
printf("%f\n", 1); // 1.000000 ???
printf("%d\n", (int)(1.0 + 'A')); // 66
float fl = 1.92;
printf("%d %f\n", (int)fl, fl); // 1 1.920000
return 0;
}
忽略掉各种警告后,
运行结果如下:
分支结构
if 语句
if(条件表达式1){
语句块1;
} else {
语句块2;
} // 基本形式
if(条件表达式1){
if(条件表达式1.1){
语句块1.1;
} else {
语句块1.2;
}
} else {
if(条件表达式2.1){
语句块2.1;
} else {
语句块2.2;
}
} // 嵌套形式
if(条件表达式1){
语句块1;
} else if(条件表达式2){
语句块2;
} else if(条件表达式3){
语句块3;
} else if(条件表达式4){
语句块4;
} ... // 分层结构(多分支)
注意:
1、if 和 else 语句,if 后面可以没有 else,else 前面必须有 if 语句
2、else 后面不能加条件,但可跟 if
3、if 和 else 语句中间不能有间隔语句(if 控制下,有且仅有一条语句时,才可以省略花括号)
switch 语句
switch(变量或表达式) // 必须为整型值或字符型值
{
case 常量(表达式)一:
语句块一;
break;
case 常量(表达式)二:
语句块二;
break;
....
case 常量(表达式)n:
语句块 n;
break;
default:
语句块 n+1;
break; // 这里的 break 可以省略
}
循环结构
for 循环
for(表达式一; 表达式二; 表达式三){
语句块;
}
表达式一:赋初值给循环变量,通常是赋值表达式;在for语句前给循环变量赋初值时,该表达式可省略
表达式二:循环的条件,根据条件判断是否结束循环,通常是关系表达式或逻辑表达式;死循环时可省略
表达式三:修改循环变量的值(通常增值或减值),可省略
while 循环
定义循环变量并赋值;
while (判断条件) // 表达式
{
语句块;
循环变量的增值或减值语句;
}
执行顺序:
1)定义循环变量并赋值;
2)判断是否符合循环条件,如果符合就进入循环3)。如果不满足条件,跳转到5);
3)执行语句块及增值或减值语句;
4)跳转到2);
5)条件不成立,退出循环。
// 举例,1 ~ 10累加
int main(int argc, char const *argv[])
{
int i = 1,num = 0;
while (i <= 10)
{
num += i;
i++;
printf("%d\n", i);
}
printf("%d\n", num);
return 0;
}
do-while 循环
// 在 do 上面定义循环变量并赋值
do{
语句块;
增值减值语句;
}while(循环条件);
//先执行后判断
// 实现 1-10 求和
int main(int argc, char const *argv[])
{
int i = 1, num = 0;
do{
num += i;
i++;
// printf("%d\n", i);
} while (i <= 10);
printf("%d\n", num);
return 0;
}
循环控制语句
break;
continue;
break; // 直接结束当前一层循环
continue; // 结束本次循环,继续下一次循环(未跳出当前层的循环,且continue后的语句不执行)
使用场景:
使用在循环语句中,结束循环
使用时需要有判断条件
// 跳出多层循环时,可参考如下操作:
for (i = 0; i < M; i++)
for (j = 0; j < N; j++)
for (k = 0; k < L; k++)
{
if (判断条件)
{
i = M;
j = N;
break;
}
}
// 循环从终端输入整数,判断是不是偶数,偶数打印提示语句,输入0的时候结束循环。
#include <stdio.h>
int main(int argc, char const *argv[])
{
int a;
while(scanf("%d", &a) != 0){ // scanf();的返回值为正确输入数据的个数,1!=0,所以会进入while循环 //删掉!=0也可
if(a == 0)
break;
if(a % 2 != 0)
continue;
printf("It is an even number. \n");
}
return 0;
}
goto;
无条件转移语句,用来改变程序流向,转去执行 语句标号所标识的语句。
goto; 可以用来构造循环、实现条件转移、跳出循环体等。
mark:
代码块;
goto mark;
// ————————————————————————————
goto mark;
mark:
代码块;