C语言笔记【更新中】
翁恺1.1.1-7.2.2学习
1.3.1 编写第一个c语言程序
#include <stdio.h>
int main()
{
printf("HELLO WORLD\n");
return 0;
}
1.3.3 %d输出
例如
printf("%d",12+34);
printf("12+34=%d",12+34);
// %d表示有一个数要输出至这个位置中
//在c语言四则运算中加=+;减=-;乘=*;除=/;取余=mod/%
**
2.1.2 变量定义
**
在一个程序中输入为scanf("%d“;&price);
//price是变量,需要在代码段最初的地方进行定义,例如int price;double price;float price
//可以根据要计算的数值在定义不同类型的变量。
例如编程找零钱
#include <stdio.h>
int main()
{
int price;
printf("请输入金额:\n");
scanf("%d",&price);
int change=100-price;
printf("%d\n",change);
return 0;
}
2.1.3 变量的赋值和初始化
例如int price=0
//这里就是对price初始化price的初始值为0。这里的等号是将右边的值赋给左边的变量。在计算机程序设计中,a=b是将b的值赋给a。
只有在代码开头的地方能定义变量。
2.1.4 关于scanf的一些点
例如
int a = 0;int b = 0;
scanf("%d %d";&a,&b);
printf("%d %d";a,b);
retrun 0;
//终端输入1 2,结果需要在终端随机再打一个再能输出1 2;
但如果代码为
scanf("%d,%d";&a,&b);
//输入1 2不成立输出为1 0,并未对b进行赋值。输入1,2则成立。
2.1.5 常量vs变量 不变的量是常量
#include<stdio.h>
int main()
{
const int amount = 100;
int change;
int price;
scanf("%d",&price);
change=amount-price;
printf("%d",change);
return 0;
}
//const 是一个常量变量,是不可以被赋值的。
2.1.6 浮点数
整数运算的部分只存在整数结果,有小数运算都需要运用浮点数
float double 输入%lf 输出%f
如果一个程序中 以int作为变量进行小数运算,例如 int x=10;x=x/3,则输出为3,会将小数部分自动抹去,但是如果为x=x/3.0,输出为3.33,因为这样会将整数运算自动转化为浮点数运算。输出为%f形式。
2.2.1 表达式:运算符和算子
运算符指的是做加减乘除的符号;
算子指的是变量,可能为返回值,也可能为输出值。
//计算时间差小作业
#include<stdio.h>
int main()
{
int hour1,minute1,time1;
int hour2,minute2,time2;
printf("请输入第一个时间\n");
scanf("%d %d",&hour1,minute1);
printf("请输入第二个时间\n");
scanf("%d %d",&hour2,minute2);
time1=hour1*60+minute1;
time2=hour2*60+minute2;
printf("时间差为%d小时%d分钟",(time1-time2)/60,(time1-time2)%60);
return 0;
}
//利用除数与余数来计算所相差的时间
2.2.2 运算符优先级
对于运算符的优先级,级别越低越优先
级别最高
优先级为1 运算符+- 取正负(非加减) 运算方式为自右向左,例如a*-b
级别第二
优先级为2 运算符*,/,% ;乘除余 运算方式为自左向右,例如a/b,a%b等
级别第三
优先级为3 运算符+- 加减运算 运算方式为自左向右,a+b a-b;
级别第四
优先级为4 赋值= 运算方式自右向左,将右边的值赋给左边;
2.2.3
//交换数字c代码编写
#include<stdio.h>
int main()
{int i,j,k;
i=10;
j=30;
k=i;
i=j;
j=k;
printf("i=%d,j=%d",i,j);
return 0
}
2.2.4 关于复合赋值和递增递减的问题
复合赋值必须需学习这些
例如sum+=12 代表sum=sum+12 sum*=12 代表sum=sum*12
主要是a++以及++a的意思。
a++的意思主要为a先使用后加,++a是先加后使用
来一段编程
#include<stdio.h>
int main()
{
int a=11;
printf("a++的值为%d",a++);//先使用a 后a=a+1;
printf("a=%d",a);//a=a+1;
printf("++a的值为%d",++a);//先对a加1后使用a;
printf("a=%d",a);
return 0;
3.2.1 做判断
做判读,在上述有一个编程内容为计算时间差,但如果hour2大于hour1,会出现负数情况,因此我们要做一个时间大小的判断。
利用if(m1<0) {m1=m1+60;h1--;}
或者利用abs函数
#include<stdio.h>
#include<stdlib.h> // 引入 abs 函数
int main()
{
int hour1, minute1;
int hour2, minute2;
printf("请输入时间(格式:小时 分钟)\n");
scanf("%d %d", &hour1, &minute1); // 简化输入格式
printf("请输入第二个时间(格式:小时 分钟)\n");
scanf("%d %d", &hour2, &minute2);
// 计算总分钟数并取差值绝对值
int total_minutes1 = hour1 * 60 + minute1;
int total_minutes2 = hour2 * 60 + minute2;
int diff = abs(total_minutes2 - total_minutes1); // 确保时间差非负
// 转换为小时和分钟
int h = diff / 60;
int m = diff % 60;
printf("时间差为%d小时%d分钟\n", h, m);
return 0;
}
3.2.2 判断条件:关系运算,作比较的运算符
关系符运算结果为1或者0;如果关系符运算是成立的,那么结果为1;如果关系符运算不成立,那么结果为0;
#include<stdio.h>
int main()
{
printf("%d\n",5==3);//结果为0
printf("%d\n",5!=3);//结果为1
printf("%d\n",5>3);//结果为1
return 0;
}
//所有的关系运算比算数运算优先级低,但是比赋值优先级高;
3.2.4 否则的话(if-else)
//以下为找零钱代码
#include<stdio.h>
int main()
{
int price=0;
int charge=0;
printf("请输入价格:\n");
scanf("%d",&price);
printf("请输入你的支付:\n");
scanf("%d",&charge);
if(charge>=price)
{
printf("应该找您%d元\n",charge-price);
}
else {
printf("穷逼\n");
}
return 0;
}
3.2.5 if语句的深入
如果if后面没有跟{}的大括号,if后面的那句话就是if成立所要执行的语句
if(total>mumber) k++;
//如果total大于mumber,k递增一个;
关于利用if-else的语句做薪水计算
#include<stdio.h>
int main()
{
const double rate=8.5;
const int standard=40;
double time;
printf("请输入工作时长:\n");
scanf("%d",&time);
if (time>standard) printf("您的工资为%d\n",standard*rate+(time-standard)*rate*1.5);
else printf("您的工资为%d\n",time*rate);
return 0;
}
3.3.1 利用if-else做嵌套来比较大小
//输入三个数,谁的数最大,代码如下
#include<stdio.h>
int main()
{
int a,b,c;
int max=0;
printf("请输入三个数\n");
scanf("%d %d %d",&a,&b,&c);
if(a>b)
{
if(a>c) max=a;
else max=c;
}
if(a<b)
{
if(b>c) max=b;
else max=c;
}
printf("这三个数最大的数字为%d\n",max);
return 0;
}
3.3.2 if-else if-else
在编程语言中,我们嵌套使用if语句,可以使用else if做多重选择
if() xxxxx;
else if() xxxxx;
else xxxxx;//如果if与elseif都没通过,直接输出else语句中的内容。
3.3.4 switch-case
//首先switch-case只能代表整数型的结果
具体的格式如下
int type;
switch(type)
{
case 1:xxxx;break;
case 2:xxxx;break;
default:xxxx;
}
只有遇到break才会跳出switch-case
#include<stdio.h>
int main()
{
int type;
scanf("%d",&type);
switch (type)
{
case 1:printf("你好\n");
case 2:printf("你在干嘛\n");
break;
case 3: printf("what are you doing\n");break;
default:printf("kkkkk\n");break;
}
return 0;
}
4.1.1 利用while循环while(n>0){}
只有当while后面括号内内容不成立时候,才会跳出这个循环。
以下为数数字代码程序
#include<stdio.h>
int main()
{
int n;
int i=0;
printf("请输入一个数\n");
scanf("%d",&n);
n/=10;
i++;
while (n>0)
{
i++;
n=n/10;
}
printf("这个数共有%d数",i);
return 0;
}
4.1.3 do-while循环
do-while循环在第一轮循环时不做检查而是在第一轮循环做完结束后再看是否满足条件
do
{xxxx;
xxxx;
}while();//这里要加一个分号
#include<stdio.h>
int main()
{
int n;
int i=0;
printf("请输入一个数\n");
scanf("%d",&n);
do
{
i++;
n=n/10;
}while(n>0);
printf("这个数共有%d数",i);
return 0;
}
4.2.2 猜数游戏
主要利用do-while 还有rand随机函数等等
#include<stdio.h>
#include<stdlib.h>//rand()函数的头文件
#include<time.h>
int main ()
{
srand(time(0));//srand()设置随机种子,使每次运行生成不同的随机序列
int a =rand();//a是随机数 int(0-32767)
int n;
int i=0;
int num;
num=a%100+1;//生成1-100的随机数
printf("请输入你要输入的数字\n");
do
{
i++;
scanf("%d",&n);
if(n>num) printf("你的数大了\n");
else if(n<num) printf("你的数小了\n");
}while(n!=num);
printf("恭喜你答对了,数字为%d,你一共答%d次\n",num,i);
return 0;
}
4.2.3 平均数计算
//平均数计算
#include<stdio.h>
int main()
{
int num=0;
int sum=0;
int count=0;
do
{
printf("请输入你要输入的数字\n");
scanf("%d",&num);
if(num!=-1)
{
sum+=num;
count++;
}
}while(num!=-1);
printf("这几个数的平均数为%f\n",1.0*sum/count);
return 0;
}
4.2.4 整数求逆
#include<stdio.h>//整数求逆,例如729---927
int main()
{
int number;
int digit;
int ret=0;
printf("请输入一个数\n");
scanf("%d",&number);
while(number>0)
{
digit=number%10;
number/=10;
ret=ret*10+digit;
}
printf("数字的逆序列为%d\n",ret);
}
5.1.1 关于for循环
先用while引入一个阶乘
#include<stdio.h>//阶乘
int main()
{
int factor=1;
int i=1;
int n;
printf("请输入一个数字\n");
scanf("%d",&n);
while(i<=n)
{
factor*=i;
i++;
}
printf("%d的阶乘为%d\n",n,factor);
return 0;
}
for循环三要素,(初始值,条件,递增/递减)
#include<stdio.h>
int main()
{
int factor=1;
int i;
int n;
printf("请输入一个数字\n");
scanf("%d",&n);
for(i=1;i<=n;i++)//这条很关键,为for循环的关键语句
{
factor*=i;
}
printf("%d的阶乘为%d\n",n,factor);
return 0;
}
for循环每一步都是可以省略的
例如 for(;xxx;)省略了初始条件和每步的要求==while(xxx)
5.2.1 循环控制:如何用break和continue来控制循环
//素数编程(只能被1以及自身所整除的数)
#include<stdio.h>//判断是否为素数
int main()
{
int i;
int num;
int k=0;
printf("请输入一个数\n");
scanf("%d",&i);
num=i;
for (i=2;i<=(num-1);i++)
{
if (num%i==0)
{
k++ ;printf("不是素数\n");break;
}//break是打破这层循环要出去
//continue是将这一次循环还没做的东西直接不做跳到下一次循环
}
if(k==0) printf("是素数\n");
return 0;
}
5.2.2 循环嵌套
//关于输出100以内的素数编程
#include<stdio.h>
int main()
{
int isprime;
int i;
int k;
for(k=2;k<=100;k++)
{
isprime=1;//初始化isprime
for(i=2;i<k;i++)
{
if(k%i==0) isprime=0;break;
}
if (isprime==1) printf("%d\n",k);
}
return 0;
}
5.2.3 从嵌套的循环中跳出,break只能跳出其所在的循环;
continue也只能执行在当前循环;
#include<stdio.h>
int main()
{
int one,two,five,x;
int exit;
x=2;
for(one=1;one<x*10;one++)
{
for(two=1;two<x*10;two++)
{
for(five=1;five<x*10/5;five++)
{
if(one*0.1+two*0.2+five*0.5==x)
{
exit=1;
printf("%d个一角%d个两角%d个五角可以组成%d元 \n",one,two,five,x);
}break;//还有一种方法 使用goto语句 例如在这 goto out
}if(exit==1) break;
}if(exit==1) break;
}
//out:
return 0;
}
5.3.1 设方程f(n)=1+1/2+1/3…+1/n 输入n的值求和
#include<stdio.h>//1到1/n的求和
int main()
{
int i;
double sum=0.0;
int n;
printf("请输入一个数\n");
scanf("%d",&n);
for(i=1;i<=n;i++)
{
sum+=1.0/i;
}
printf("f(%d)的值为%f",n,sum);
}
5.3.2 整数分解(123456–1 2 3 4 5 6)
//思路:先将整数求逆(123456–654321)
后续做拆分(654321-1 2 3 4 5 6)
代码部分
#include <stdio.h>//只适用于末尾没有0的情况
int main ()
{
int x;
int j;
int k;
printf("请输入一个数\n");
scanf("%d",&x);
int t=0;
while(x!=0)
{
j=x%10;
t=10*t+j;
x/=10;
}
x=t;
do
{
k=x%10;
printf("%d",k);
if(x>9) printf(" ");
x=x/10;
}while(x>0);
return 0;
}
以下是存在数字末尾存在0的情况
#include<stdio.h>
#include<math.h>//pow函数运用头文件
int main()
{
int x,t;
x=700;
t=x;
int cnt=0;
do{
x/=10;//x1=3425....x4=5
cnt++;//cnt=1....cnt=4
}while(x>0);
printf("cnt=%d\n",cnt);//cnt=5
int mask = pow(10,cnt-1);//pow函数含义:例如pow(2,3)=2^3 这里代表10^(cnt-1)
//这里mask=10000 x=13425
x=t;
do{
int d=x/mask; //x1=1
printf("%d",d);//输出1
if(mask>0){
printf(" ");
}
x%=mask;//x1=3425
mask/=10;//mask1=1000
}while(mask>0);
return 0;
}
5.3.3 求最大公约数
思路为枚举法
#include<stdio.h>
int main()
{
int num1,num2;
printf("请输入两位数\n");
scanf("%d %d",&num1,&num2);
int t=0;
if(num1>=num2) t=num2;
else t=num1;
for(;t>0;t--)
{
if(num1%t==0&num2%t==0)
{
printf("%d与%d的最大公约数为%d\n",num1,num2,t);
break;
}
}
return 0;
}
6.30-7.6 学到数组那边
6.1.1 求符合给定条件的整数集
例如给定一个不超过6的整数A,考虑从A开始的连续4个数字,输出所有符合条件的三位数。//例如A=2,2 3 4 5组成不重复的三位数,例如234 243…
#include<stdio.h>
int main()
{
int a;//例如a=2;
int cnt=0;
printf("请输入一个数\n");
scanf("%d",&a);
int b,c,d;//abc acb acd adc abd adb
//bad bda bcd bdc bac bca
//cab cba cad cda cbd cdb
//dab dba dac dca dbc dcb
b=a;//b=2
while(b<=a+3)//b<=5 b=2345
{
c=a;//c=2
while(c<=a+3)//c<=5 c=2345
{
d=a;//d=2
while(d<=a+3) //d=2345
{
if(b!=c){
if(b!=d){
if(c!=d){
cnt++;
printf("%d%d%d",b,c,d);
if(cnt==6)
{
printf("\n");
cnt=0;
}
else printf(" ");
}
}
}
d++;
}
c++;
}b++;
}
return 0;
}
6.1.2 经典水仙花数(153=1^ 3+5 ^ 3+3^3)
//计算N位水仙花数
#include<stdio.h>
#include<math.h>
int main()
{
int i,j,k;
int n;
printf("请输入一个数字\n");//n取3--7
scanf("%d",&n);//求n位中所有的水仙花数
for(i=1;i<=9;i++)//i=123456789
{
for(j=0;j<=9;j++)//j=123456789
{
for(k=0;k<=9;k++)//k=123456789
{
if(i*100+j*10+k==pow(i,n)+pow(j,n)+pow(k,n))
{
printf("%d%d%d\n",i,j,k);
}
}
}
}
return 0;
}
6.1.3 九九乘法表
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n);//n=9
int i,j;
int num=0;
i=1;
while(i<=n)//i<=9
{
j=1;
while(j<=i)//j=123456789
{
printf("%d*%d=%d",j,i,i*j);//这里注意ij顺序
j++;num++;
if(i*j<10) printf(" ");
else printf(" ");
}
printf("\n");
i++;
}
return 0;
}
6.1.4 素数求和编程练习
//输入两个数字M,N,求在M到N之间的所有素数个数和素数总的和
#include<stdio.h>//素数代表只能被1和自身整除的数字
int main()
{
int n1,n2;
printf("请输入两位数\n");
scanf("%d %d",&n1,&n2);
int sum=0;
int count=0;
int k;//n1=10 n2=31
/*
思路:首先利用sum来做素数求和
利用count来输出素数个数
输入的数字为n1;n2;
判断n1是否为素数,如果是,count++,sum+=n1;
*/
for(;n1<=n2;n1++)//n1:10--31
{
for(k=2;k<n1;k++)//k:2--(9-30)
{
if(n1%k==0)//这步说明不是素数
{
break;
}
if(k==(n1-1))
{
count++;
sum+=n1;
printf("%d\n",n1);
}
}
}
printf("素数的和为%d,素数个数为%d",sum,count);
return 0;
}
6.1.5 猜数游戏(升级版)
/*
猜数字游戏:输入一个100以内的整数与最大猜测数字,让机器去猜测
如果数字一次被猜测出来,则提示“bingo”
三次以内猜出来,则提示“lucky you”
若三次以上猜出来,则提示“good guess"
如果超过n次都没有猜测出来,则提示“game over”
如果猜的数字大,提示“too big”
如果猜的数字小,提示“too small”
*/
#include<stdio.h>
int main()
{
int number,n;//代表输入的数字与输入次数
int inp;//代表输入的数字
int finished=0;//表示状态
int cnt=0;//输入成功时候的次数
scanf("%d %d",&number,&n);
do{
scanf("%d",&inp);
cnt++;
if(inp<0){
printf("Game Over\n");
finished=1;
}else if(inp>number){
printf("Too big\n");
}else if(inp<number){
printf("too small\n");
}else{
if(cnt==1){
printf("Bingo\n");
}else if(cnt<=3)
{
printf("Lucky you!\n");
}
else {
printf("Good Guess\n");
}
}
if (cnt==n){
if(!finished){
printf("Game Over\n");
}
finished=1;
}
}while(!finished);//对finish取非当finish为1时候退出
return 0;
}
6.1.6 n项求和(2/1+3/2+4/3+5/4+…)
//要求输出的数字保留两位小数 %.2f
#include<stdio.h>
int main()
{
int n;
double dividend,divisor;
double sum=0.0;
int i;
double t;
scanf("%d",&n);
//n=20000;
dividend=2;
divisor=1;//dividend divisor的初始值
for(i=1;i<n;i++)
{
sum+=dividend/divisor;
t=dividend;
dividend=divisor+dividend;//递增叠加
divisor=t;
}
printf("%.2f",sum);//保留两位小数点
return 0;
}
6.2.1 c语言有哪些数据类型,sizeof可以做什么
*
c语言数据类型:
整数:
char
int
long
short
long long
浮点数:
double
float
long double
逻辑:
bool
指针
自定义类型
*
类型有何不同
类型名称:int long double
输入输出时类型的变化:%d %ld %lf
所表达的数字范围:char<short<int<float<double
内存中所占据的大小:1个字节到16个字节
内存中的表达形式:二进制数(补码),编码*
//sizeof 用于计算字节大小的运算符 例如sizeof(int)
sizeof不会去做真的计算
#include<stdio.h>
int main()
{
int a;
a=6;
printf("%d\n",sizeof(a++));
printf("a=%d\n",a);
return 0;//输出结果为a=6,a不等于7,因为sizeof里面的内容a++没有执行
}
6.2.2 除了int,还有多少整数类型
sizeof字节计算
sizeof(char)=1 -128----127
sizeof(int)=4
sizeof(float)=4
sizeof(double)=8
sizeof(long double)=16
sizeof(short)=2 -32768----32767
sizeof(long)=4
sizeof(long long)=8
int 是用来表达寄存器大小的
*6.2.3 整数的内部表达 尤其负数是如何表达的
整数在计算机内部是由二进制表达的
例如18------0001 0010 //2^4 + 2 ^1=18
二进制负数
一个字节可以表达的数
00000000-11111111(0-255)
三种方案:
1.仿照十进制,用一个特殊的符号表示负数
2.取中间的数为0;例如1000 0000为0,比他大为正数;比他小为负数
3.补码
//补码:假设00000000—0
00000001—1
因为111111111+00000001=1 0000 0000=0
所以0-1=-1=(1) 0000 0000-0000 0001=1111 1111
所以当1111 1111被当作二进制看待是255
被当作补码看待为-1
同理,对于一个数-a;他的补码为0-a,实际上为2^n-a;
//在计算机中,补码的意义就是可以拿补码和原码加出溢出的一个零
6.2.4 整数的范围:如果整数越界了会怎么样
#include<stdio.h>
int main()
{
unsigned char c =255;// unsigned char:0---255
int i = 255;
c++;//c=256越界 255+1=0
printf("c=%d,i=%d\n",c,i);
return 0;//c=0;i=255
}
6.2.5 整数的格式化,如何格式化输入输出整数,如何处理八进制和十六进制
//1.整型的输入输出 形式只有int long long
int:%d
unsigned int:%u
long long:%ld
unsigned long long:%lu
//2.一个数字0开头就是八进制,一个数字0x开头就是十六进制
6.2.6 选择整数类型:没什么特殊需要就用int
6.2.7 浮点类型:double和float,它们是什么,如何输入输出
输入输出:float:输入%f 输出%f
double:输入%lf 输出%f
特殊输出%e//会输出科学计数法
6.2.8 浮点数的范围和精度:浮点数到底能代表哪些数
//可以理解为有误差
#include<stdio.h>
int main()
{
float a,b,c;
a=1.345f;
b=1.123f;
c=a+b;
if(c==2.468) printf("相等\n");
else printf("不相等");//输出结果为不相等
}
//因为float计算结果存在误差
6.2.9 字符类型
//char是一种整数,也是一种特殊的类型:字符,主要是因为
1.用单引号代表字符的字面量:‘a’ ‘1’
2.‘ ’也是一个字符
3.printf和scanf用%c来输入输出字符
#include<stdio.h>
int main()
{
char c;
char d;
c=1;
d='1';
if(c==d) printf("相等\n");
else printf("不相等\n");
printf("c=%d\n",c);
printf("d=%d\n",d);
return 0;//输出为 不相等 c=1 d=49
}//输出为1的 ASCII码 ‘1’=49
/*关于字符输入输出*/
#include<stdio.h>
int main()
{
int i;
char c;
scanf("%d %c",&i,&c);
printf("i=%d,c=%d,c='%c'\n",i,c,c);
return 0;//输出:i=12;c=97;c='a'
}
6.2.10 逃逸字符
逃逸字符的类型:
\b 回退一格
\ " 双引号
\t 到下一个表格位
\ ’ 单引号
\n 换行
\ \ 反斜杠本身
\r 回车
6.2.11 类型转换
1. 类型自动转换
//当运算符的两边出现不一样的类型时,会自动转换成较大的类型
大的意思是能表达的数的范围越大
char–short–int–long–long long
int–float–double
//对于printf来说,任何小于int的数都会被自动转化为int,float会被转换成double,但是scanf不会,要输入short,需要%hd
2. 强制类型转换
//需要把另一个量强制转化为另一个类型(通常是较小的类型)
需要:(类型)值 例如int(10.2) short(32)
强制运算的优先级高于四则运算
6.3.1 逻辑类型:表示逻辑运算和关系运算结果的量
//bool
使用头文件#include<stdbool.h>
之后就可以用bool,true,false
#include<stdio.h>
#include<stdbool.h>
int main()
{
bool a=6>5;
bool b=true;
printf("%d %d %d",a,b,sizeof(bool));
return 0;
/*
输出结果为 1 1 1
*/
}
6.3.2 逻辑运算,对逻辑变量进行与、或、非运算
//逻辑运算的结果只能为1或者0,true为1,false为0
逻辑量是关系运算或者逻辑运算的结果
//1.逻辑非 ( !a ) 如果a是0;则!a=1;若a=1;!a=0
2.逻辑与(a&&b)如果a与b都是true,则结果为true,否则为false
3.逻辑或( a||b )如果a与b都是false,输出为false,否则为true
口诀:非取反;与有0出0;或有1出1
//例如要表示4<x<6
x>4&&x<6;
age>20&&age<30; //表示20<age<30
index<0||index>99; //表示index不在0-99范围内,index<0或者>99
!age<20;// !age取值只能为0或者1 所以!age输出只能为1
优先级 !> &&> | |
//逻辑运算优先级很低,但是比赋值要高
//短路情况
例如当a==6&&b+=1
因为逻辑运算的运算规则是自左向右,&&是有0出0;a==6如果结果是0;则不会进行右边的计算,b+=1是不会发生计算的;
6.3.3 条件运算和逗号运算
条件运算符: count=(count>20)? count-=10:count+=10;
//意思为如果count>20;count>20为1 count=1为真,所以执行count-=10;
如果count<20;count<20为0 count=1为假;执行count+=10;
逗号运算符:逗号用来连接两个表达式,并以其右边的表达式的值作为它的结果。逗号的优先级是所有的运算符中最低的,所以它两边的表达式会先计算;逗号的组合关系是自左向右,所以左边的表达式会先计算,而右边的表达式的值就留下来作为逗号运算的结果。
#include<stdio.h>
#include<stdbool.h>
int main()
{
int i=(3+4,5+6);
printf("%d",i);
return 0;
//输出结果为11,因为逗号运算符是输出逗号后面那个值
}
/*逗号表达式主要在for循环使用
例如for(i=0,j=10;i<j;i++,j--)
7.1.1 初见函数
//求和函数如下
#include<stdio.h>
void sum(int begin ,int end)
{
int i;
int sum=0;
for(i=begin;i<=end;i++)
{
sum+=i;
}
printf("%d到%d的和为%d\n",begin,end,sum);
}
//调用sum求和函数
int main()
{
sum(1,10);
sum(20,30);
sum(35,45);
return 0;
}
7.1.2 函数的定义和调用
//函数定义:函数是一块代码,接收零个或多个参数,做一件事情,并返回零个或一个值
调用函数 ;
函数名(参数值);
()起到了表示函数调用的重要作用
即使没有参数也需要()
如果有参数,则需要给出正确的数量和顺序
这些值会被按照顺序依次用来初始化函数中的参数
7.1.3 从函数中返回
#include<stdio.h>
int max(int a,int b)//函数 max
{
int ret;
if(a>b){
ret=a;
}else{
ret=b;
}
}
int main()
{
int a,b,c;
a=5;
b=6;
c=max(10,12);//c=12
printf("%d\n",c);
c=max(a,b);//c=6
printf("%d\n",c);
c=max(c,23);//c=23
printf("%d\n",c);
return 0;
}
//没有返回值的函数
void 函数名(参数表)
不能使用带值的return
可以没有return
调用的时候不能做返回值的赋值
void sum(int begin,int end)
{
int i;
int sum;
for(i=begin;i<=end;i++)
{
sum+=1;
}
printf("%d到%d的和是%d\n",begin,end,sum);
}//这段void函数没有return存在
7.2.1 函数先后关系
#include<stdio.h>
void sum (int begin,int end);
/*若sum使用void函数,必须在头文件下面声明
并且要带上分号!!!
*/
int main()
{
sum(1,10);
sum(20,30);
sum(35,45);
return 0;
}
void sum (int begin,int end)
{
int i;
int sum=0;
for(i=begin;i<=end;i++)
{
sum+=i;
}
printf("%d到%d的和是%d\n",begin,end,sum);
}
7.2.2 参数传递
//如果函数有参数,调用函数时必须传递给它数量、类型正确的值
可以传递给函数的值是表达式的结果,这包括:
1.字面量
2.变量
3.函数的返回值
4.计算的结果
#include<stdio.h>
void cheer(int i)
{
printf("cheer %d\n",i);
}
int main()
{
cheer(2.4);
/*
输出为cheer 2
*/
double f=2.4;
cheer(f);
//输出还是为cheer2
return 0;
}
//c语言在调用函数时,永远只能传值给函数
每个函数有自己的变量空间,参数也位于这个独立的空间中,和其他函数没有关系
//传值
每个函数有自己的变量空间,参数也位于这个独立的空间中,和其他函数没有关系
过去,对于函数参数表中的参数,叫做形式参数,调用函数时给的值,叫做实际参数
7.2.3 本地变量
//本地变量的规则:
1.本地变量是定义在块内的
1.1它可以是定义在函数的块内的
1.2 也可以定义在语句的块内
1.3甚至可以随便拉一对大括号来定义变量
2.程序运行进入块之前,其中的变量不存在,离开这个块,其中的变量就消失了
3.在块外面定义的变量在里面仍然有效
4.块里面定义了和外面同名的变量则掩盖外面的
5. 不能在一个块内定义同名的变量
6.本地变量不会被默认初始化
7.参数在进入函数的时候被初始化了
#include<stdio.h>
void cheer(int i)
{
printf("cheer %d\n",i);
}
int main()
{
cheer(2.4);
/*
输出为cheer 2
*/
double f=2.4;
cheer(f);
{
int i;
i=0;
printf("i=%d\n",++i);
}
// i++; 此条语句不生效,出了块内就不存在i变量
//输出还是为cheer2
return 0;
}
7.2.4 函数庶事:一些有关函数的细节问题,main()是什么
//没有参数时
void f(void)
还是
void f()
在传统c中,它表示f函数的参数表未知,并不代表没有参数
8.1.1 初试数组
#include<stdio.h>
int main()
{
int x;
double sum=0;
int cnt=0;
int number[100];//定义数组
scanf("%d",&x);
while(x!=-1)
{
number[cnt]=x;//对数组中的元素赋值
sum+=x;
cnt++;
scanf("%d",&x);
}
if(cnt>0)
{
printf("%f\n",sum/cnt);
int i;
for(i=0;i<cnt;i++){
if(number[i]>(sum/cnt)){
printf("%d ",number[i]);//使用数组中的元素
}
}
}
return 0;
}
8.1.2 定义数组
//<类型> 变量名称 [元素数量];
int grades[100];
double weight[20];
元素数量必须是整数
**//int a[10 ]
*一个int的数组
*十个单元:a[0]-a[9]
*每一个单元就是一个int类型的变量
可以出现在赋值的左边或右边:
a[2]=a[1]+6;
在赋值左边的叫做左值
//int a【0】
可以存在,但是无用