前言
本节内容涵盖了初阶的循环,输入,输出,函数,结构体,数据类型大小,选择,预处理,宏关键字和指针初级。
一、循环
for循环
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
//for(初始化部分;判断部分;调整部分)
for (int i = 0; i <= 100; i++)
printf("i = %2d\n", i);
//break跳出它所属的那个循环
//continue跳过本次循环后面的语句,再次进入循环进行处理
return 0;
for尽量使用左闭右开
/*int arr[10] = { 0 };
int i = 0;
for (i = 0; i < 10; i++)
printf("i = %2d\n",arr[i]);
return 0;*/
for循环的变种:判断部分的省略会让它成为死循环,因为判断部分恒为真
/*for (;;)
printf("呵呵\n");*/
for循环省略初始条件:
int i = 0;
int j = 0;
for (; i < 3; i++)
for (; j < 3; j++)
//当i=1,j循环三次后j=3,此时跳出第二层的循环,i++进入第二次循环,
//此时j=3不进行再次循环,退出并打印三次呵呵
{
printf("呵呵\n");
}
return 0;
}
int i = 0;
int k = 0;
for (i = 0, k = 0; k = 0; i++, k++) //循环要执行0次,因为k=0是赋值,k=0为假,不进行循环
k++;
return 0;
}
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
/*
for (int i = 1; i <= 10; i++)
printf("i = %2d\n",i);
*/
/*
int i = 1;
while (i <= 10)
{
if (i == 5)
break; //在while中,break用于永久的终止循环
printf("i = %2d\n", i);
i++;
}
*/
int i = 1;
while (i <= 10)
{
if (i == 5)
continue; //在while中,continue用于跳过它后面的循环,进行再次判断while的循环条件,检测是否进行下一次循环
printf("i = %2d\n", i);
i++;
}
return 0;
}
dowhile循环
/*
do
循环语句;
while(表达式)
*/
#include <stdio.h>
int main(void)
{
int i = 1;
do
{
printf("i = %2d\n", i);
i++;
} while (i < 11);//注意封号不能少
return 0;
}
switch循环
/*
switch(整型表达式)
{
case 整型表达式:
语句;
}
*/
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
int day = 0;
printf("请输入1-7:");
scanf("%d", &day);
switch (day)
{
case 1: //case决定入口,break决定出口,没有break,会沿着case1一直执行到case7
printf("星期一\n");
break;
case 2:
printf("星期二\n");
break;
case 3:
printf("星期三\n");
break;
case 4:
printf("星期四\n");
break;
case 5:
printf("星期五\n");
break;
case 6:
printf("星期六\n");
break;
case 7:
printf("星期七\n");
break;
default:
printf("非法输入!\n");
break;
}
return 0;
}
二、输入输出函数
1.输入getchar
代码如下(示例):
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
char password[20] = { 0 };
printf("请输入密码:>");
scanf("%s", password); //password是一个数组,数组的数组名就是地址,所以此处不需要再去取地址
printf("请确认密码(Y/N):>");
//清理缓存区的一个字符
//getchar();//处理'\n'既回车按键
int temp = 0;
while ((temp = getchar()) != '\n'); //清除缓存区的多个字符,读一行
int ch = getchar();
if (ch == 'Y')
{
printf("确认成功\n");
}
else
{
printf("确认失败\n");
}
return 0;
}
/*
vs2019结果:
请输入密码:>12356
请确认密码(Y/N):>确认失败
时间:2022年2月7日21:29:51
功能:了解getchar的功能
*/
2.输出函数putchar
代码如下(示例):
#include <stdio.h>
int main(void)
{
int ch = 0;
while ((ch = getchar()) != EOF)
{
if (ch < '0' || ch > '9')
continue;
putchar(ch);
}
return 0;
}
//getchar :从键盘获取字符
//EOF:是文件结束标志 end of file
#include <stdio.h>
int main(void)
{
/*
int ch = getchar();
printf("%c\n", ch);
putchar(ch); //输出一个字符
*/
int ch = 0;
while ((ch = getchar() ) != EOF) //Ctrl+z用来读取结束
{
putchar(ch);
}
return 0;
}
三、函数
代码如下(示例):
#define _CRT_SECURE_NO_WARNINGS
普通法相加
#include <stdio.h>
int main(void)
{
int a, b;
scanf("%d %d",&a,&b);
int sum = a + b;
printf("%d",sum);
return 0;
}
#include <stdio.h>
函数法相加
int add(int x, int y)
{
int z = 0;
z = x + y;
return z;
}
int main(void)
{
int a, b;
printf("请输入加数a和b的值:\n");
scanf("%d %d",&a,&b);
int sum = add(a, b); //函数的方式解决
printf("sum =%d", sum);
}
数组,是用下标来访问的
/*int arr[10] = {1,2,3,4,5,6,7,8,10};
int i = 0;
while (i < 10)
{
printf("%d\n", arr[i]);
i++;
}
return 0;
}*/
//int a = 9 / 2;
float a = 9 / 2.0; //除号两端有一个是小数,才会被判别为小数除法
printf("%f", a);
return 0;
}
四、操作符
位操作符
&按位与 |按位或 ^按位异或
int a = 2;
a = a + 5;
a += 5;
!把真变成假,把假变成真 if(a)如果a真 if(!a)如果a假
sizeof是一个操作符,用来计算变量类型的大小 sizeof a 表示是操作符 sizeof(a)是求大小 以字节为单位
arr[10] = {...}
printf("%d",sizeof(arr))
~ 按位取反:按二进制位取反(所有位)把所有二进制位中数字,1变成0,0变成1 00000000 00000000 000000000 00000000-->11111111 11111111 11111111 11111111
整数在内存中存储的是补码 一个整数的二进制表示有三种:原码 反码 补码
/*-1:10000000 00000000 00000000 00000001(原码)第一位1为符号位
反码:11111111 111111111 11111111 11111110
补码:反码+1=补码 11111111 11111111 11111111 11111111 计算机中存储的是补码
原码,反码,补码针对负数才计算 正数的原码,补码,反码相同
*/
int a = 0;
printf("%d\n", ~a);//00000000 000000000 00000000 00000000-->11111111 11111111 11111111 11111111:11111111...-->对应的原码:10000000 00000000
// 00000000 00000001-->-1 原码=求反(补码-1)
return 0;
}
-- ++
int a = 10;
//int b = ++a;
int c = a++;
printf("a = %d\n", a); //前置++,先++ 后使用 后置++ ,先使用,后++
//printf("b = %d\n", b);
printf("c = %d\n", c);
return 0;
}
三目操作符:exp1?exp2:exp3 exp1成立,exp2计算,整个表达式的结构是exp2的结果 exp1不成立,exp3计算,整个表达式结构是exp3的结果
int a = 6;
int b = 3;
int max;
max = a > b ? a : b;
printf("max = %d\n", max);
return 0;
}
逗号表达式:用逗号隔开的一串表达式,逗号表达式是从左向右依次计算,整个表达式的结果是最后一个表达式的结果
下标引用操作符:[]
函数调用操作符:()函数名后边的-->()
//左移操作符:移动的是二进制位
int a = 2;
int b = a << 1; //000000000 00000000 00000000 00000010 int4个字节,对应4*8=32位 a的二进制序列向左移动一位--> 00000000 00000000 00000000 000000100
printf("%d", b);
return 0;
}
五、预处理
c语言提供的关键字
1.c语言自己提供的,不能自己创造关键字
2.变量名不能是关键字
extern:用来申明外部符号的,auto:每个局部变量都是auto修饰的 register:寄存器关键字
static:静态的,unio:共用体(联合体) void 无(空)
预处理指令:define include
#define 定义常量和宏
define 是一个预处理指令 1-->define定义一个常量 #define MAX 100 2-->定义宏:#define ADD(x,y)x+y
4*ADD(2,3)----4*2+3=11 宏就是一种替换
六、指针初级
指针 32位--32根地址线--物理线--通电--1/0
int a = 10;
printf("%p\n", &a);//只会拿出它从前往后的第一个地址 %p用来打印地址
int *pa = &a;//pa是用来存放地址的,所以pa称为指针变量
*说明pa是指针变量 int 说明pa所指向的对象是int类型的
char ch = 'w';
char *pc = &ch; //*是给pc的,说明pc是指针,而前面的char是说明pc所指向的变量类型是char类型
return 0;
}
指针变量可以存放自己的地址吗?int *pa = &pa;可以放进去但是变量类型不同会出错
int a = 10;
int* pa = &a;
*pa = 20;//*是解引用操作,*pa就是通过pa里面的地址找到a
printf("a=%d\n", a);
return 0;
}
指针的大小是相同的4或者8,因为:指针是用来存放地址的,指针需要多大空间,取决于
地址的存储需要多大空间 32位机器 一个地址32bit 4byte 64位机器 一个地址64bit 8byte4
七、指针初级
指针 32位--32根地址线--物理线--通电--1/0
int a = 10;
printf("%p\n", &a);//只会拿出它从前往后的第一个地址 %p用来打印地址
int *pa = &a;//pa是用来存放地址的,所以pa称为指针变量 *说明pa是指针变量 int 说明pa所指向的对象是int类型的
char ch = 'w';
char *pc = &ch; //*是给pc的,说明pc是指针,而前面的char是说明pc所指向的变量类型是char类型
return 0;
}
指针变量可以存放自己的地址吗?int *pa = &pa;可以放进去但是变量类型不同会出错
int a = 10;
int* pa = &a;
*pa = 20;//*是解引用操作,*pa就是通过pa里面的地址找到a
printf("a=%d\n", a);
return 0;
}
指针的大小是相同的4或者8,因为:指针是用来存放地址的,指针需要多大空间,
取决于地址的存储需要多大空间 32位机器 一个地址32bit 4byte 64位机器 一个地址64bit 8byte4
八、结构体初级
结构体:用来描述复杂对象,让c语言创造新的类型出来
struct Stu //创建一个学生
{ //成员
char name[20];
int age;
double score;
};
//创建一个书的类型
struct Book
{
char name[20];
float price;
char id[30];
};
//结构体的创建和初始化
struct Stu s = {"张三", 20, 85.5};
printf("%s %d %lf\n", s.name, s.age, s.score); //点操作符 结构体变量.成员变量
//->操作符
struct Stu *ps = &s; // double 用%lf float 用%f *ps是结构体指针
printf("%s %d %lf\n",(*ps).name,(*ps).age,(*ps).score);
printf("%s %d %lf\n", ps->name,ps->age,ps->score); //->箭头->成员名必须左边是结构体指针
return 0;
}
总结
了解的基础上加深学习,欢迎指正