1.标准数据类型
#include<stdio.h>
#include<stdint.h>//标准数据类型头文化
//标准数据类型非库里面的,所有的平台都可以使用的
int main()
{
typedef signed char int8_t;
typedef short int16_t;
typedef int int32_t;
typedef long long int64_t;
typedef unsigned char uint8_t;
typedef unsigned short uint16_t;
typedef unsigned int uint32_t;
typedef unsigned long long uint64_t;
typedef signed char int_least8_t;
typedef short int_least16_t;
typedef int int_least32_t;
typedef long long int_least64_t;
typedef unsigned char uint_least8_t;
typedef unsigned short uint_least16_t;
typedef unsigned int uint_least32_t;
typedef unsigned long long uint_least64_t;
return 0;
}
2.ASCLL字符码
ASCII ((American Standard Code for Information Interchange): 美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。它是最通用的信息交换标准,并等同于国际标准ISO/IEC 646。ASCII第一次以规范标准的类型发表是在1967年,最后一次更新则是在1986年,到目前为止共定义了128个字符
备注:需要记住常见的ASCLL码 值
0 ~ 9 0X30 ~ 0X39
A ~ Z 0X41 ~ 0x5A
a ~ z 0x61 ~ 0x7A
空格:0X20
回车:0X0d
换行:0x0a
3.字符
3.1 字符和宽字符
char ch1 = 'a'; //一个字符占一个字节大小
short ch2 = 'b'; //一个字符占2个字节
printf("%C",&ch1) //char
printf("%C",&ch2) //short 大写的C
wchar_t ch1 = L'中'; //一个字符占两个字节大小
wprint(L"%c",ch1); //加上L,小写c
print("%C",ch1); //不加L,大写C
3.2 设置不同国家的语言的设置
#include<locale.h> // 包含头文件
setlocale(LC_ALL, "zh-CN"); // 设置区域 实现宽字符的显示
setlocale(LC_ALL, "zh-CN");
//wchar_t wch1 = L'中'; //width
wchar_t wch1 = 0x4e2d; //width 0~65535
printf("%C %hx\n", wch1, wch1);
4.表达式
4.1运算符
4.1.1一元运算符:
符号 | “属性” | 备注 |
---|---|---|
- ~ - | 求反和补数运算符 | |
\* & | 间接寻址运算符和 address-of 运算符 | |
sizeof | Size 运算符 | 计算数据类型字节数 |
+ | 一元加运算符 | |
++ – | 一元递增和减量运算符 |
代码示例:
#include<stdio.h>
#include<stdint.h>
int main()
{
//sizeof
int a=10;
printf("sizeof int =%d",sizeof(a)); //int数据是4字节
//++
//前置++
int n1=1;
int n2=1;
n2=n1++;
printf("n1 = %d, n2 = %d ",n1,n2);//n2=1,n1=2 前置++先赋值+1
//后置++
int n3=1;
int n4=1;
n3=n4++;
printf("n4 = %d, n3 = %d ",n4,n3);//n2=2,n1=2 后置++ 先计算后+1
return 0;
}
4.1.2二元运算符
C 提供了以下二进制运算符:
符号 | “属性” |
---|---|
\* / % | 乘法运算符 |
+ - | 相加运算符 |
<< >> | 移位运算符 |
<><>==< | 关系运算符 |
& | ^ | 位运算符 |
&& || | 逻辑运算符 |
, | 有序评估运算符 |
4.1.3逻辑运算符
逻辑运算符不执行常用算术转换。 相反,它们根据其等效性为 0 计算每个操作数。 逻辑运算的结果不是 0 就是 1。 结果的类型为 int
。
C 逻辑运算符如下所述:
运算符 | 描述 |
---|---|
**&& ** | 如果两个操作数具有非零值,则逻辑“与”运算符产生值 1。 如果其中一个操作数等于 0,则结果为 0。 如果逻辑“与”运算的第一个操作数等于 0,则不会计算第二个操作数。 |
|| | 逻辑“或”运算符对其操作数执行“与或”运算。 如果两个操作数的值均为 0,则结果为 0。 如果其中一个操作数具有非零值,则结果为 1。 如果逻辑“或”运算的第一个操作数具有非零值,则不会计算第二个操作数。 |
== | 判断两个是否相等,要和赋值= 区分开来,第一个操作数等于第二个操作数 |
!= | 第一个操作数不等于第二个操作数 |
! | 取反 真(非0)取反就是假(0),假(0)区分就是真(非0) |
4.1.4 C 运算符的优先级和关联性
符号 1 | 操作类型 | 结合性 |
---|---|---|
[ ] ( ) . -> ++``-- (后缀) | 表达式 | 从左到右 |
sizeof & * + - ~ ! ++``-- (前缀) | 一元 | 从右到左 |
typecasts | 一元 | 从右到左 |
* / % | 乘法 | 从左到右 |
+ - | 加法 | 从左到右 |
<< >> | 按位移动 | 从左到右 |
< > <= >= | 关系 | 从左到右 |
== != | 相等 | 从左到右 |
& | 按位“与” | 从左到右 |
^ | 按位“异或” | 从左到右 |
| | 按位“与或” | 从左到右 |
&& | 逻辑“与” | 从左到右 |
|| | 逻辑“或” | 从左到右 |
? : | 条件表达式 | 从右到左 |
= *= /= %= += -= <<= >>= &= ^= |= | 简单和复合赋值 2 | 从右到左 |
, | 顺序计算 | 从左到右 |
1 运算符按优先级的降序顺序列出。 如果多个运算符出现在同一行或一个组中,则它们具有相同的优先级。
2 所有简单的和复合的赋值运算符都有相同的优先级。
5.分支
5.1 if语句
//双支if语句
if(括号内为判定的条件 )
{
花括号内为执行的代码
}
else
{
花括号内为执行的代码
}
//多支if语句
if(括号内为判定的条件 )
{
花括号内为执行的代码
}
else if
{
花括号内为执行的代码
}
else
{
花括号内为执行的代码
}
案例:
if ( i > 0 )
y = x / i;
else
{
x = i;
y = f( x );
}
如果 y = x/i;
大于 0,则执行 i
语句。
如果 i
小于或等于 0,则将 i
赋给 x
,并将 f( x )
赋给 y
。
请注意,构成 if
子句的语句以分号结尾。
if语句多条件(案例如上)
5.2 do……while语句
执行过程如下所示:
- 执行语句体。
- 接着,计算 expression 。 如果 expression 为 false,则 do-while 语句将终止,控制权将传递到程序中的下一条语句。 如果 expression 为 true(非零),则将从第 1 步开始重复此过程。
当 、goto
或 return
语句在语句主体中执行时,do-while 语句也可以终止。
do
{
y = f( x );
x--;
} while ( x > 0 );
在此 do-while 语句中,无论 x
的初始值是什么, 和 x--;
这两个语句都会执行。 然后将计算 x > 0
。 如果 x
大于 0,则会再次执行语句体并重新计算 x > 0
。 只要 x
保持大于 0,语句主体就会重复执行。 当 变为 0 或负值时,do-while 语句的执行将终止。
将至少执行一次循环体。
5.3 while语句
执行过程如下所示:
-
计算 expression 。
-
如果 expression 最初为 false,则绝不执行 语句体,并且控制从
while
语句到程序中下一语句的传递。如果 expression 为 true(非零),则执行语句体,并且此过程从第 1 步开始重复。
当语句主体中的 break
、goto
或 return
执行时,while
语句也可以终止。 使用 continue
语句可以在不退出 while
循环的情况下终止迭代。 continue
语句将控制权传递给 while
语句的下一个迭代。
while ( i >= 0 )
{
string1[i] = string2[i];
i--;
}
此示例将 string2
中的字符复制到 string1
。 如果 i
大于或等于 0,则 string2[i]
将赋给 string1[i]
,并且 i
将递减。 当 i
达到 0 或小于 0 时,while
语句的执行将终止。
while 和 do …… while 的比较
1、do …… while 一定会执行一次在判断
2、while 先判断在执行
5.5 for语句
for (表达式1; 表达二2; 表达式3)
{
循环代码
}
for
语句的执行将按以下方式继续:
- 将计算 init-expression(如果有)。 这将为循环指定初始化。 对表达式1的类型没有限制。
- 将计算 表达式二(如果有)。 此表达式必须具有算法或指针类型。 它在每次迭代前计算。 可能有三个结果:
- 如果 表达式二 为 (非零),则执行语句,然后计算 表达式三(若有)。 在每次迭代之后,将计算表达式三。 对其类型没有限制。 副作用将按顺序执行。 该过程随后从计算 cond-expression 重新开始。
- 如果省略了 表达式二,则 表达二 被视为 true,执行将完全按上一段中所述方式继续。 只有在执行了语句主体中的
break
或return
语句时,或只有在执行了goto
(转到for
语句主体外的带标签的语句)时,没有 cond-expression 参数的for
语句才会终止。 - 如果 cond-expression 为 (0),则
for
语句的执行终止,并将控制权传递给程序中的下一个语句。
//输入10个数,计算出最大的值
int nCount = 0;
printf("input count:\n");
scanf_s("%d", &nCount);
int nMax = 0;
printf("please input number:\n");
scanf_s("%d", &nMax);
for (int i = 0; i < nCount - 1; i++) {
int nInput = 0;
scanf_s("%d", &nInput);
if (nInput > nMax) {
nMax = nInput;
}
}
printf("max is %d\n", nMax);
5.4面向过程编程思想
案例一:
/*
项目需求:
比较输入两个整数的大小
面向过程编程思想:
1.定义两个变量
1)定义整型变量1,初始化为0
2)定义整型变量2, 初始化位0
2.提示用户输入
1)printf
3.接受用户输入两个数
1)scanf,判断输入合法性
4.判断两数的大小
1)如果第一个数大于第二个数
a)显示第一个数大
2)如果第一个数小于第二个数
a)显示第二个数大
3)如果第一个数等于第二个数
a)显示两数相等
5.程序结束
*/
int main() {
int nNumber1 = 0;
int nNumber2 = 0;
printf("Please Input Numbers:\n");
int nRet = scanf("%d %d", &nNumber1, &nNumber2);
if (nRet != 2) {
printf("Invalid Input\n");
return 0;
}
if (nNumber1 > nNumber2)
{
printf("nNumber1 Is Max\n");
}
else if (nNumber1 < nNumber2)
{
printf("nNumber2 Is Max\n");
}
else
{
printf("nNumber1 Equal nNumber2\n");
}
return 0;
}
案例二:
/*
项目需求:
2.比较输入10个整数的大小
面向过程编程思想:
1.定义变量保存最大的数
2.提示用户输入
1)如果次数大于10,结束程序
2)printf
3.接受用户输入数
1)scanf,判断输入合法性
4.判断如果输入的数大于保存的数据
1)保存的数据 = 输入的数
5.重复第2步骤
6.程序结束
*/
int main() {
int nCount = 0;
printf("input count:\n");
scanf_s("%d", &nCount);
int nMax = 0;
printf("please input number:\n");
scanf_s("%d", &nMax);
for (int i = 0; i < nCount - 1; i++)
{
int nInput = 0;
scanf_s("%d", &nInput);
if (nInput > nMax)
{
nMax = nInput;
}
}
printf("max is %d\n", nMax);
return 0;
}
案例三:
/*
面向过程 =》 分而治之 => 大事化小 小事化了
1.定义变量n = 0,
2.保存用户输入的值到n
3.j = 0
4.判断j < n
1).i = 0
2).判断i < n
1)输出一个*
2)i = i + 1
3)重复2)
3).输出换行
5.j = j + 1
6.重复3
7.0程序结束
*/
unsigned n = 0;
scanf_s("%d", &n);
for(unsigned j = 0; j < n; j = j + 1)
{
for (unsigned i = 0; i < n; i = i + 1)
{
printf("* ");
}
printf("\n");
}
案例四:
//闰年:四年一润,百年不润(year % 4 == 0 && year % 100 != 0) 四百年再润(year % 400 ==0)
/*
1.定义一个无符号unsigned short变量, 初始化为1
2.输入年份
3.判断(year % 4 = 0 && year % 100 != 0)
1)满足显示闰年
2)不满足
a)判断(year % 400 ==0)
1.满足显示润年
2.不满足显示不是润年
*/
unsigned short nYear = 1;
scanf_s("%hd", &nYear);
if ((nYear % 4 == 0 && nYear % 100 != 0) || (nYear % 400 == 0))
{
printf("Is Leap Year\n");
}
else
{
printf("Is Not Leap Year\n");
}
案例五:
//15.输入某年某月某日,判断这一天是这一年的第几天?
/*
某月几天 + 日 = 第几天
某月几天 3 = 1 + 2
每个月有几天
1=31
2=润年29 非润年28
3 = 31
4 = 30
5 = 31
6 = 30
7 = 31
8 = 31
9 = 30
10 = 31
11 = 30
12 = 31
2000 3 1
1.定义年月日变量
2.输入年月日
3.检查年月日
4.计算前一个月的总天数days
如果月为1 + 0
如果月为2 + 31
4 = 1 + 2 + 3
5.days + 日
6.显示days
*/
unsigned nDays = 0;
for (int i = 1; i <= nMonth - 1; i++)
{
if (i == 2) //如果月份2月份
{
if ((nYear % 4 == 0 && nYear % 100 != 0) || (nYear % 400 == 0))
nDays += 29; //闰年2月份29天
else
nDays += 28; //闰年2月份28天
}
else if (i < 8) //如果月份大于1~7月份 奇数31天 偶数30天
{
if (i % 2 == 0)
{
nDays += 30;
}
else
{
nDays += 31;
}
}
else if (i >= 8) { //如果月份8~12月份 奇数30天 偶数31天
if (i % 2 == 0)
{
nDays += 31;
}
else
{
nDays += 30;
}
}
}
printf("%d", nDays + nDay);
案例六:
//30.编写程序将一个输入的十进制数转换成一个二进制数,并且显示
/*
int 32次
char 8次 0000 0000
1.定义变量
2.输入一个数到变量
3.定义变量i = 0
4.i < sizeof type
1).变量除2,显示余数
2).变量 = 变量 / 2
3).i++
3).重复3
1111 1110
1000 0000 1
0111 1110
0100 0000
*/
unsigned long long n = 0;
scanf_s("%lld", &n);
unsigned i = 0;
unsigned long long nShift = 0x8000000000000000;
while(i < sizeof(n) * 8)
{
printf("%d", n / nShift);
n = n % nShift;
nShift = nShift / 2;
i++;
}
案例六:
//32.以每行5个数来输出300以内能被7或17整除的偶数,并求出其和。
/*
1.0~300
xxx
2.每行5个数
xxx
3.能被7或17整除的偶数
xxx
4.求出其和
xxx
*/
int nCount = 0;
int nSum = 0;
for (int i = 1; i <= 300; i++)
{
if (i % 2 == 0 && (i % 7 == 0 || i % 17 == 0))
{
printf("%-4d ", i);
nCount++;
nSum += i;
if (nCount % 5 == 0) {
printf(" sum:%d\n", nSum);
nSum = 0;
}
}
}
printf(" sum:%d\n", nSum);
return 0;
}