C语言学习笔记

1.c语言基本语句符号

<1>.printf("")

(1)输出

  • printf("Hello World!\n");

  • ""⾥⾯的内容叫做“ 字符串 ”,printf会把其中的内 容原封不动地输出;

  • \n表⽰需要在输出的结果后⾯换⼀⾏;

(2)输出结果

  • printf("%d\n", 23+43);

  • %d说明后⾯有⼀个整数要输出在这个位置上

  • printf("23+43=%d\n", 23+43);

#include <stdio.h>

int main()
{
	printf("x+y=%d\n", 23+46);
	
	printf("hello world\n");
	
	printf("23+56=%d\n", 23+56);
	
	return 0;
}

 

<2>.scanf("", &)

(1)读入

  • scanf("%d整数",&x);scanf("%lf浮动",&x);

&为读取地址;&把读到的值赋予后项变量;

  • 也可以读取多个变量,比如:

#include <stdio.h>

int main ()

{
	int a;
	int b;
	printf("请输入a,b的值");
	scanf("%d %d", &a,&b);
	printf("%d+%d=%d\n" ,a,b,a+b);
	

}

2.变量

<1>.变量(int)

  • int price标识符 = 0;

  • 这⼀⾏,定义了⼀个变量。变量的名字是

price,类型是int,初始值是0。

  • 变量是⼀个保存数据的地⽅,当我们需要

在程序⾥保存数据时,⽐如上⾯的例⼦中

要记录⽤户输⼊的价格,就需要⼀个变量

来保存它。⽤⼀个变量保存了数据,它才

能参加到后⾯的计算中 ,⽐如计算找零。

  • int为整数类型

<2>.常量(const)

  • const是⼀个修饰符,加在int的前⾯,⽤来

给这个变量加上⼀个const(不变的)的属

性。这个const的属性表⽰这个变量的值⼀

旦初始化,就不能再修改了。

  • const int AMOUNT;

  • int change = AMOUNT - price;

  • 如果你试图对常量做修改,把它放在赋值

运算符的左边,就会被编译器发现,指出

为⼀个错误。

<5>.赋值(=)

  • 和数学不同,a=b在数学中表⽰关系,即a

      和b的值⼀样;⽽在程序设计中,a=b表⽰

      要求计算机做⼀个动作将b的值赋给a。

     关系是静态的,⽽动作是动态的。在数学

     中,a=b和b=a是等价的,⽽在程序设计

     中,两者的意思完全相反。

  • 赋值也是运算,也有结果,结果为被赋的值。

 

#include <stdio.h>

int main()
{
	int a=5;
	int b=6;
	int t;//增加容器做调换
	t=a;
	a=b;
	b=t;
	
	printf("%d %d", a,b);
	
	return 0;
 } 

<6>.浮点数变量(double)

  • inch是定义为int类型的变量,如果把int换

成double,我们就把它改为double类型的

浮点数变量了。

  • double的意思是“双”,它本来是“双精度浮

点数”的第⼀个单词,⼈们⽤来表⽰浮点

数类型。除了double,还有float(意思就

是浮点!)表⽰单精度浮点数。

  • 当浮点数与整数放在一起计算时,c语言会

    自动将整数转化为浮点数;

3.表达式

<1>.算符c语言符号

四则运算c符号意义
++
--
×*
÷/
mod%取余
()()括号

<2>.算符优先级

优先级运算符运算结合关系举例
1+单目不变自右向左a*+b
1-单目取负自右向左a*-b
2*自左向右a*b
2/自左向右a/b
2%取余自左向右a%b
3+自左向右a+b
3-自左向右a-b
4=赋值自右向左a=b

 

<3>.递减递增运算符的前缀型与后缀型

表达式运算表达式的值
count++给count加1count原来的值
count--给count减1count原来的值
++count给count加1count加1以后的值
--count给count减1count减1以后的值

 

4.判断

<1>.if(){}语句判断

(1)条件(关系运算)

  • 计算两个值之间的关系成为关系运算;

    运算符意义
    ==相等
    !=不等
    >大于
    >=大于等于
    <小于
    <=小于等于

  • 关系运算的结果

    • 当两个值的关系符合关系运算符的预期时,

      关系运算的结果为整数1,否则为整数0 ;

      #include <stdio.h>
      
      int main
      {
      printf("%d\n", 5==3);//0
      printf("%d\n", 5>3);//1
      printf("%d\n", 5<=3);//0
      
      return 0;    
      }    

  • 关系运算的优先级

    • 所有的关系运算符的优先级⽐算术运算的 低,但是⽐赋值运算的⾼;

    • 判断是否相等的==和!=的优先级⽐其他的 低,⽽连续的关系运算是从左到右进⾏的;

(2).if语句

  • 一个if语句由一个关键字if开头,跟上在括号里表示条件的逻辑表达。然后一对{}之间的若干语句。如果表示条件的逻辑表达式结果不为0(条件成立),那么执行后面语句,否则不执行跳过;

(3)代码演示

#include <stdio.h>

int main{
    int a,b;
    printf("请输入两个数");
    scanf("%d %d",&a,&b);
    
    int max= 0;
    if(a>b){
        max=a;
    }
    if(a<b){
        max=b
    }
        printf("大的是%d\n",max);
    
    return 0;
}

 或者我们可以

#include <stdio.h>

int main{
    int a,b;
    printf("请输入两个数");
    scanf("%d %d",&a,&b);
    
    int max= b;
    if(a>b){
        int max= a;
    }
     printf("大的是%d\n",max);
    
    return 0;
}

 

<2>.if-else语句

(1)else语句

  • 接在if语句之后,与if语句是相反不包含关系,如果...否则的话...;与连用if...if...相比,好处是不用判断多次,如果前项if成立则不需要判断后项else。

(2)if-else 嵌套

  • 嵌套的判断:当if的条件满足或不满足的时候要执行的语句也可以是一条if或if-else语句,这就是嵌套的if语句

  • else的匹配:else总是和最近的那个if匹配(都有括号或者都没括号)

  • 缩进格式不能暗示else匹配。

  • 在if或else后面总是用{}较好。

    #include <stdio.h>
    
    int main()
    {
    	int a,b,c;
    	
    	int max = 0;
    	
    	printf("请输入a,b,c的值");
    	scanf("%d %d %d",&a,&b,&c);
    	if(a>b){
    		if(a>c){
    			max=a;
    		}else {
    			max=c;
    		}
        } else{
        	if(b>c){
        		max=b;
    		}
    		else{
    			max=c;
    		}
    	}
    	
    	printf("max=%d\n",max);
    	
    	return 0;
    	
    }

    (3)if-else级联

  • 级联的if-else if

    if( exp1 )
        st1;
    else if( exp2 )
        st2;
    else
        st3;

    <3>.switch-case 语句

    (1)switch-case 语句

  • 控制表达式只能是整数型

  • 结果

  • 常量可以是常数,也可以是

  • 常数计算的表达式

  • 根据表达式的结果,寻找匹

  • 配的case,并执⾏case后⾯的

    语句,⼀直到break为⽌

  • 如果所有的case都不匹配,那

  • 么就执⾏default后⾯的语句

    如果没有default,那么就什么

    都不做

(2)break

  • switch语句可以看作是⼀种基于计算的

跳转,计算控制表达式的值后,程序会

跳转到相匹配的case(分⽀标号)处。

分⽀标号只是说明switch内部位置的路

标,在执⾏完分⽀中的最后⼀条语句后,

如果后⾯没有break,就会顺序执⾏到下

⾯的case⾥去,直到遇到⼀break,或

者switch结束为⽌。

(3)代码演示

#include <stdio.h>

int main()
{  int grade = 0;
   printf("请输入成绩:");
   scanf("%d", &grade);
   grade /=10;
   /* case只可辨别常量 */ 
   switch (grade){
   	case 10:
   		//printf("A\n");
   		//break; 
   	case 9:
	   printf("A\n");
	   break;
	case 8:
	   printf("B\n");
	   break;
	case 7:
	   printf("C\n");
	   break;
	case 6:
	   printf("D\n");
	   break;
	default:
	   printf("F\n");
	   break;         	
   }
	return 0;
}

5.循环

<1>.while循环语句

(1)while 语句

  • 如果我们把while翻译作“当”,那么⼀个 while循环的意思就是:当条件满⾜时,不断地重复循环体内的语句。

  • 循环执⾏之前判断是否继续循环,所以有可能循环⼀次也没有被执⾏;

  • 条件成⽴是循环继续的条件。

(2)代码演示

#include <stdio.h>

int main()
{
	int x;
	int n=0; 
	
	printf("x=");
    scanf("%d",&x);
	n++; //包含0的话此处不可略去,正整	 数可略去 
	x /=10;
	
	while(x>0){
		n++;
		x /= 10;
	//用于检查每一步骤中的x与n的值	printf("x=%d n=%d\n",x,n);
	}
	printf("n=%d",n);
	return 0;
 } 

<2>.do-while循环语句

(1)do-while语句

  • 在进⼊循环的时候不做检查,⽽是在执⾏完⼀轮循环体的代码之后,再来检查循环的条件是否满⾜,如果满⾜则继续下⼀轮循环,不满⾜则结束循环

  • do-while循环和while循环很像,区别是在循环体执⾏结束的时候才来判断件。也就是说,⽆论如何,循环都会执⾏⾄少⼀遍,然后再来判断条件。while循环相同的是,条件满⾜时执⾏循环,条件不满⾜时结束循环。

  • 最后的括号有分号。

(2)代码演示

#include <stdio.h>

int main()
{
	int x;
	int n= 0;
	
	printf("x=");
	scanf("%d", &x);
	
	do
	{   x /=10;
		n++;
	}while(x>0);
	
	printf("n=%d",n);
	
	return 0;
}

 

#include <stdio.h>

int main()
{   
    int sum= 0;
	int count= 0;
	int number;
    printf("请输入number="); 
    scanf("%d",& number);
    while (number != -1){
    	sum += number;
    	count++;
    	printf("请输入number=");
    	scanf("%d",& number);
	}
	
	/*do{printf("请输入number=");
	     scanf("%d",& number);
	     if(number!=-1){
	     sum += number;
	     count ++;}
	 }while(number !=-1);
	*/
    printf("%f",1.0*sum/count);
	
	return 0;

}

<3>.for循环语句

(1).for语句与while语句的差别

  • for==while

(2)for语句

  • for ( 初始动作; 条件; 每轮的动作 ) { }

    for中的每⼀个表达式都是可以省略的 for (; 条件; ) == while ( 条件 )

  • for循环像⼀个计数循环:设定⼀个计数器,初始化它,然后在计数器到达某值之前,重复执⾏循环体,⽽每执⾏⼀轮循环,计数器值以⼀定步进进⾏调整,⽐如加1或者减1

(3)for==对于

  • for ( count=10; count>0; count-- )

就读成:“对于⼀开始的count=10,当 count>0时,重复做循环体,每⼀轮循环 在做完循环体内语句后,使得count--。”

 

(4)代码演示

#include <stdio.h>

int main()
{
	int x;
	int i= 1;
	int ans= 1;
	
	printf("x=");
	scanf("%d",&x);
	
	for(i=1;i<=x;i++){
		ans *= i;
	//	printf("%d\n",i);
	}
	
	printf("x!=%d,i=%d",ans,i);
	
	return 0;
 } 

(5)循环次数

  • for(i=0;i<n;i++) ->循环次数是n,循环结束以后,i的值是n。循环的控制变量是i,是选择0开始还是1开始,是判断i<n还是判断i<=n,对循环的次数,循环结束后变量的值都有影响

(6)三种循环

  • 如果有固定次数,用for循环

  • 如果必须执行一次,用do-while循环

  • 其他的用while循环

(4)if语句中的break

#include <stdio.h>

int main()
{
	int x;
	int i;
	int isPrime= 1;
	
	printf("x=");
	scanf("%d",&x); 
	
	for(i=2;i<x;i++){
		if(x % i == 0){
			int isPrime= 0;
			break; 
		}
	}
	
	if(isPrime==1){
		printf("是素数\n");
	}else{
			printf("不是素数\n");	
	} 

	return 0;
}

(5)if的嵌套循环

  • 循环里面还是循环;
#include <stdio.h>

int main()
{
	int x;
	int count = 0; 
	
	for (x=1;count<50;x++){
        int i;
        int isPrime= 1;

        for(i=2;i<x;i++){
            if(x % i == 0){
                isPrime= 0;
                break; 
            }
        }

        if(isPrime==1){
            printf("%d\t",x);
            count ++;
            if(count%5==0){
                printf("\n");
            }
        }

	}
	
    return 0; 
 }

 

<6>.从循环中跳出

(1)接力break

#include <stdio.h>

int main()
{
	int x=2;
	int one,two,five;
	int exit= 0;
	
	//printf("x=");
	//scanf("%d",&x);
	
	for(one=1;one<x*10;one++){
		for(two=1;two<x*10/2;two++){
			for(five=1;five<x*10/5;five++){
				if(one+two*2+five*5==x*10){
					printf("你需要%d个一角,%d个两角,%d个五角凑齐%d元\n",one,two,five,x);
				    exit= 1;
				    break;
				}
			}
			if(exit==1) break;//第三轮循环结束后到这
		}
		if(exit==1) break;//第二轮循环结束后到这
	}//第一轮循环结束后到这

	return 0;
 } 

(2)goto语句

  • out 是自定义,goto语句避免了上述代码中繁琐的break跳出循环的过程

#include <stdio.h>

int main()
{
	int x=2;
	int one,two,five;
	
	//printf("x=");
	//scanf("%d",&x);
	
	for(one=1;one<x*10;one++){
		for(two=1;two<x*10/2;two++){
			for(five=1;five<x*10/5;five++){
				if(one+two*2+five*5==x*10){
					printf("你需要%d个一角,%d个两角,%d个五角凑齐%d元\n",one,two,five,x);
				    goto out;
				}
			}
		}
	}out:

	return 0;
 } 

6.c语言的数据类型

<1>.类型

  • 整数:char,short,int,long,long long
  • 浮点数:float,double,long double
  • 逻辑:bool
  •  指针
  • 自定义类型

 

<2>.sizeof

  • sizeof是一个运算符,给出某个类型或变量在内存中所占据的字节数

    • sizeof(int);sizeof(i).输出格式为%ld

  • sizeof 是静态运算符,结果在编译时已决定。sizeof中的运算结果不在代码中运行。  
#include <stdio.h>

int main()
{
	int a;
	a = 6;
	printf("sizeof(int)%ld\n",sizeof(int));
	printf("sizeof(a)%ld\n",sizeof(a));
	return 0;
 } 
#include <stdio.h>

int main()
{
	int a;
	a = 6;
	printf("sizeof(double)=%ld\n",sizeof(long double));
	printf("sizeof(a)=%ld\n",sizeof(a++));
	printf("a=%d\n",a);//次数a的值为6,a++没有运算
	return 0;
}

<3>.整数存储字节

  • char:1字节(8比特)
  • short:2字节
  • int:取决于cpu,通常的意义是一个字
  • long:取决于cpu,通常的意义是一个字
  • long long:8字节
#include <stdio.h>

int main()
{
	printf("sizeof(char)=%ld\n",sizeof(char));//1
	printf("sizeof(short)=%ld\n",sizeof(short));//2
	printf("sizeof(int)=%ld\n",sizeof(int));//4
	printf("sizeof(long)=%ld\n",sizeof(long));//4
	printf("sizeof(long long)=%ld\n",sizeof(long long));//8
	
	return 0;
}

 

<4>.二进制负数

  • 一个字节可以表达的数:00000000——11111111
  • 三种方案表达负数
    • 仿照十进制,有一个特殊的标志表示负数
    • 取中间的数为0,如10000000表示0,比他小的是负数,比他大的是正数
    • 补码

 

<5>.补码

  • 补码的意义就是拿补码和源码可以加出一个溢出的零

<6>.unsigned

  • 在整型类型前加上unsigned使得他们成为无符号的整数
#include <stdio.h>

int main()
{
	unsigned char c = 255;
	int i = 255;
	printf("c=%d,i=%d\n",c,i);
	
    return 0;	
}

 

<8>.浮点类型

(1)浮点类型

 

(2)浮点的输入与输出

 

 

#include <stdio.h>

int main()
{
	double ff = 1E-10;
	printf("%.16f,%E\n",ff,ff);
	
	return 0;
 }

(3)输出精度

 

(4)超出范围的浮点数

 

 

(5)浮点运算精度

#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("不相等 c= %.10f,或%f\n",c,c); 
	}
	
    return 0; 
}

 

(6)选择浮点类型

  • 如果没有特殊需求,只使用double

 

<9>.字符类型

(1)字符类型

 

(2)字符输入输出

 

#include <stdio.h>

int main()
{
	char c;
	scanf("%c",&c);
	printf("c=%d\n",c);
	printf("c=%c\n",c);
	
	return 0;
}

 

 

<10>.类型转换

(1)自动类型转换

 

(2)强制类型转换

 

<11>.bool类型

  • include <stdio.h>

  • 之后就可以使用bool和true,false

 

<12>.逻辑运算

(1)逻辑运算

 

 

(2)例子

 

 

(3)优先级

 

(4)短路

 

 

7.函数

<1>.函数的定义

 

 

<2>.调用函数

 

 

#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);
}

int main()
{
	sum(1,10);
	sum(20,30);
	sum(35,45);
	
	return 0;
 }

<3>.函数的返回

<4>.有返回值的函数

  • 函数中用return将return后的值传回给使用函数处;

  • 函数头定义返回类型,如int

#include <stdio.h>

int max(int a,int b)
{
	int ret;
	if(a>b){
		ret = a;//return a;
	}else{
		ret = b;//return b;
	}
	
	return ret;
}

int main(){
	
	int a,b,c;
	a = 5;
	b = 6;
	c = max(10,12);
	c = max(a,b);
	c = max(c,23);
	printf("%d\n",max(a,b));
	
	return 0;
}

 

<5>.没有返回值的函数

  • 函数头为void;

  • 不能使用return;

  • 调用时不能做返回指定的赋值

#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);
}

int main()
{
	sum(1,10);
	sum(20,30);
	sum(35,45);
	
	return 0;
 }

<6>.函数的先后关系

 

 

<7>.函数的先定义后声明

(1)函数的原型

 

(2)函数的先定义后声明

 

#include <stdio.h>

void sum(int begin,int end);

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);
	 
}

<8>.参数与变量

(1)值与参数类型不匹配

 

 

(2)传值于函数

 

(3)变量的生存期和作用域

  •  函数的每次运行,就产生了一个独立的变量空间,在这个空间中的变量,是函数的这次运行所独有的,称为本地变量
  • 定义在函数内部的变量就是本地变量
  • 参数本身也是本地变量
  • 生存期:什么时候这个变量开始出现了,到什么时候他消亡了
  • 作用域:在代码的什么范围可以访问这个变量
  • 对于本地变量,这两个问题的答案是统一的:大括号内的块

 

8.数组

<1>.数组的定义

  • <类型>变量名称[元素数量];

    • int grades[100]

    • double weight[20]

  • 元素数量必须是整数;

 

 

<2>.数组计数

#include <stdio.h>

int main()
{
	int x;
	int count[10]={0};
	int i;
	
//	for(i=0;i<10;i++){
//		count[i]=0;
//	}
	scanf("%d",&x);
	while(x!=-1){
		if(x>=0&&x<=9){
			count[x]++;
		}
		scanf("%d",&x);
	}
	for(i=0;i<10;i++){
		printf("%d:%d\n",i,count[i]);
	}
	
	return 0;
 } 

<3>.数组的集成初始化

 

 

  

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值