自动类型转换:低字节数据类型转换高字节
char--->int/short/long/long long
short--->int/long/long long
float--->double
强制类型转换
强制类型转换:高字节数据转换低字节
long long--->char/int/short/long
inn--->short/char
double--->float/int/char/short
隐式转换:
float a=3.14;
int b=a;------>b=3
显式转换:
格式:(数据类型)表达式
float a=3.14;
int b=(int)a;------>b=3
类型转换的本质就是大小端存储
思考2:假设int a=0x12345678, char b=(char)a,问如何判断大小端存储
如果b=0x78,则小端存储
如果b=0x12,则大端存储
有无符号数之间的转换
int/long有无符号数的转换(>=4字节)
规则:把有符号数转换为无符号数进行运算
short/char有无符号数的转换(<4字节)
规则:把有无符号数统一转换为有符号数int(将小于4字节的转换为4字节int)
*int 字节补全:首位是1向前补1,首位是0向前补0
思考题
格式:表达式1 运算符 表达式2
算数运算
+ | 如果运算符两侧都是整数则最终结果一定是整数 | 如果运算符两侧有一个小数则最终结果一定是小数 |
- | 如果运算符两侧都是整数则最终结果一定是整数 | 如果运算符两侧有一个小数则最终结果一定是小数 |
* | 如果运算符两侧都是整数则最终结果一定是整数 | 如果运算符两侧有一个小数则最终结果一定是小数 |
/ | 如果运算符两侧都是整数则最终结果一定是整数(5/2=2) | 如果运算符两侧有一个小数则最终结果一定是小数(5.0/2=2.5) |
%(取余) | 运算符两侧只能是整数,否则报错 | |
++(只能是对变量用) | a++ | 先运算再自加 |
++a | 先自加再运算 | |
--(只能是对变量用) | a-- | 先运算再自减 |
--a | 先自减再运算 |
关系运算
> | 条件成立(真)为1,假为0 | |
>= | 条件成立(真)为1,假为0 | |
< | 条件成立(真)为1,假为0 | |
<= | 条件成立(真)为1,假为0 | |
== | 条件成立(真)为1,假为0 | =为赋值==为等于 |
!= | 条件成立(真)为1,假为0 |
逻辑运算
!>&&>||
真:非0 假:0
&&逻辑与(且) | 全真为真,遇假则假 | 1&&1=1 1&&0=0 0&&1=0 0&&0=0 | 表达式1&&表达式2 若表达式1为假则表达式2不执行(短路效应) |
||逻辑或(或者) | 遇真则真,全假为假 | 1||1=1 1||0=1 0||1=1 0||0=0 | 表达式1||表达式2 若表达式1为真则表达式2不执行(短路效应) |
!逻辑非 | 非假即真,非真即假 | !1=0 !0=1 |
判断变量char a是否为大写:a>='A'&&a<='Z'
判断变量char a是否为小写:a>='a'&&a<='z'
判断变量char a是否为数字:a>='0'&&a<='9'
判断变量是否为特殊字符:!(a>='A'&&a<='Z'||a>='a'&&a<='z'||a>='0'&&a<='9')
条件运算/三目运算
格式:表达式1?表达式2:表达式3
表达式1:条件
表达式2:如果表达式1条件成立,则执行表达式2
表达式3:如果表达式1条件不成立,则执行表达式3
练习:
输入一个整数,判断是否为偶数
输入一个年份判断是否为闰年
输入一个字符,判断受否为大写,如果是输出小写,如果不是原样输出
赋值运算
int a=10
a+1 a的值不变
a+=1 a的值改变
a++ a的值改变
= | 基本赋值 | a=10 | 把10赋值给a =号左边只能是变量,右边可以是变量,常量表达式 |
+= | 复合赋值 | a+=2+3--->a=a+(2+3) | |
-= | 复合赋值 | a-=2+3--->a=a-(2+3) | |
*= | 复合赋值 | a*=2+3--->a=a*(2+3) |
逗号运算
逗号运算:所有运算符中优先级最低的运算
格式:(表达式1,表达式2,........,表达式n)
*最后一个表达式是最终结果
每个表达式均运行
位运算
位运算是对整数的二进制操作
&(按位与) | 1&1=1 1&0=0 0&1=0 0&0=0 | 有一个0则结果为0 |
|(按位或) | 1|1=1 1|0=1 0|1=1 0|0=0 | 有一个1则结果为1 |
^(异或) | 1^1=0 1^0=1 0^1=1 0^0=0 | 相同为0,不同为1 |
~(取反) | ~0=1 ~1=0 | 0取反为1,1取反为0 |
>>(右移) | 右移一位--除以2 8>>2=2 | 右边多余位舍去,左边最高位是0补0,左边最高位是1补1 |
<<(左移) | 左移一位--乘以2 8<<2=32 | 左边多余位舍去,右边补0 |
运算符的优先级
括号>单目运算>算数运算>左/右移>关系运算>按位与>异或>逻辑>条件>赋值>逗号
单分支选择结构
单分支选择结构:只有一个选择条件
格式:
if(表达式)
{
c语句;
}
*if :后面要加{}
*表达式:可以是任意表达式,但是一般是算数,关系,逻辑组成
*{}:可有可无,当c语句只有一句话时可以省略不写
*执行流程:如果表达式为真则执行c语句,否则跳过即可
双分支选择结构
双分支选择结构:只有两个选择条件
格式:
if (表达式)
{
c语句1;
}
else
{
c语句2;
}
*if :后面要加{}
*表达式:可以是任意表达式,但是一般是算数,关系,逻辑组成
*{}:可有可无,当c语句只有一句话时可以省略不写
*执行流程:如果表达式为真则执行c语句1,否则执行c语句2
练习:输入一个字符,如果是数字则输出立方,否则输出对应的ASCII码值
输入一个数字,判断其是否为水仙花数
水仙花数:
- 是三位数
- 各个位数字的立方和等于其本身
pow函数
功能:求x的y次方
格式:pow(x,y)
*需要添加头文件:#include <math.h>
*编译时需要链接到动态库:
gcc ***.c -lm
*pow默认是double类型
多分支选择结构
多分支选择结构:超过两个选择条件
格式:
if (表达式1)
{
c语句1;
}
else if(表达式2)
{
c语句2;
}
........
else if(表达式n)
{
c语句n;
}
*if :后面要加{}
*表达式:可以是任意表达式,但是一般是算数,关系,逻辑组成
*{}:可有可无,当c语句只有一句话时可以省略不写
*执行流程:如果表达式1为真则执行c语句1,结束;若表达式1为假,则判断表达式2,如果表达式2为真,则执行c语句2结束;若表达式2为假,重复以上步骤。所表达式n全为假则执行else
练习:输入一个浮点数的成绩,实现等级判断
练习:输入一个表达式,实现计算器+,-,*,/,%
1+2则输出3
5/2则输出2.5
练习:
假设int a=0x12345678,char b=(char)a,请写代码判断大端或小端存储?
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
int main(int argc, const char *argv[])
{
int a=0x12345678;
char b=(char)a;
if (b==0x78)
{
printf("是小端输出\n");
}
else
{
printf("是大端输出\n");
}
return 0;
}
输入用户名和密码,如果用户名和密码正确则登录成功,否则失败,默认用户名为A,密码是1234
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
int main(int argc, const char *argv[])
{
int password;
char user;
printf("输入用户名\n");
scanf("%c",&user);
printf("输入密码\n");
scanf("%d",&password);
if (password==1234&&user=='A')
{
printf("登陆成功\n");
}
else
{
printf("用户名或密码错误,登录失败\n");
}
return 0;
}
输入三角形的三条边,
如果不满足任意两边之和大于第三边,任意两边只差小于第三边,则输出不是三角形
如果满足条件,则判断是什么三角形
如果三条边相等,则等边三角形
如果任意两条相等,则等腰三角形
如果满足勾股定理,则直角三角形
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
int main(int argc, const char *argv[])
{
int l,w,h;
printf("输入长,宽,高\n");
scanf("%d%d%d",&l,&w,&h);
if (l+w<h||l+h<w||w+h<l)
{
printf("不是三角形\n");
}
else if (l==w==h)
{
printf("是等边三角形\n");
}
else if (l==w||l==h||w==h)
{
printf("是等腰三角形\n");
}
else if (pow(l,2)+pow(w,2)==pow(h,2)||pow(l,2)+pow(h,2)==pow(w,2)||pow(h,2)+pow(w,2)==pow(l,2))
{
printf("是直角三角形\n");
}
return 0;
}
下面代码执行后,a\b\c的结果是?
int a=5,b=7,c
c=a+++b
nclude <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
int main(int argc, const char *argv[])
{
int a=5,b=7,c;
c=a+++b;
printf("a=%d,b=%d,c=%d\n",a,b,c);
return 0;
}
代码如下
void main()
{
int c=9,d=0;
c=c++%5;
d=c;
printf("d=%d\n",d);
}
d=4
给定一个整数,判断它是否被3、5、7整除,并输出一下信息 (笔试)
1.能同时被3,5,7整除(直接输出3 5 7,每个数字之间一个空格)
2.只能内其中两个整数整除(输出两个数,小的在前,大的在后,例如3 5 或者 3 7 或者5 7,中间使用空格隔开)
3. 只能被其中一个整数整除(输出这个除数)
4.不能被任何数整除,输出小写字母n
案例如下:
输入:105
输出:3 5 7
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
int main(int argc, const char *argv[])
{
int a;
printf("输入一个整数\n");
scanf("%d",&a);
if (a%3==0&&a%5==0&&a%7==0)
{
printf("3 5 7\n");
}
else if(a%3==0&&a%5==0&&a%7!=0)
{
printf("3 5\n");
}
else if(a%3==0&&a%7==0&&a%5!=0)
{
printf("3 7\n");
}
else if(a%7==0&&a%5==0&&a%3!=0)
{
printf("5 7\n");
}
else if(a%3==0&&a%5!=0&&a%7!=0)
{
printf("3\n");
}
else if(a%3!=0&&a%5==0&&a%7!=0)
{
printf("5\n");
}
else if(a%3!=0&&a%5!=0&&a%7==0)
{
printf("7\n");
}
else
{
printf("n\n");
}
return 0;
}
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
int main(int argc, const char *argv[])
{
int n,k=0;
printf("输入一个整数\n");
scanf("%d",&n);
if(n%3==0){
printf("3 ");
k++;
}
if(n%5==0){
printf("5 ");
k++;
}
if(n%7==0){
printf("7 ");
k++;
}
if(k==0)
printf("n");
return 0;
}
b=10 c=12 d=120
c=-75 a=181 d= 6 e= 5