c语言学习笔记

该博客围绕C++编程展开,介绍了基本框架、变量及进制,阐述了输入输出函数printf和scanf的用法,讲解了算术、关系、逻辑等运算符,还介绍了控制流程,包括选择(if、switch)和循环(for、while等)结构,以及数组操作和一些琐碎知识,如强制类型转换等。

一.引

一、基本框架

1 /* ... */ 用于注释说明  内容不会被编译器识别,  /* */ 这种格式的注释可以单行或多行

2 所有的 C 语言程序都需要包含 main() 函数。 代码从 main() 函数开始执行。

3 printf() 用于格式化输出到屏幕。printf() 函数在 "stdio.h" 头文件中声明。

4 stdio.h 是一个头文件 (标准输入输出头文件) , #include 是一个预处理命令,用来引入头文件。 当编译器遇到 printf() 函数时,如果没有找到 stdio.h 头文件,会发生编译错误。

5 return 0; 语句用于表示退出程序。

6  任何程序都要有以下框架

  #include <stdio.h>
 
int main()
{
     
    return 0;
}

 二.变量及进制

1. 变量是一个保存数据的地方。用一个变量保存了数据,它才能参加到后面的计算中

有以下几种变量类型

char通常是一个字节(八位), 这是一个整数类型。
int整型,4 个字节,取值范围 -2147483648 到 2147483647。
loat

单精度浮点值。单精度是这样的格式,1位符号,8位指数,23位小数。

double

双精度浮点值。双精度是1位符号,11位指数,52位小数。

void表示类型的缺失。

eg.  int  price =0 定义了一个变量,变量的名字是price,类型是int,初始值是01

ps:          1.0 默认为double类型

2.变量定义的一般形式:<类型名称>   <变量名称>

3.变量的名字是一种标识符 由字母,数字,下划线组成且数字不可以在第一个位置上,c语言的标志词不可以做标识符

4.变量的初始化:<类型名称>   <变量名称>=<初始值>

5.变量在被使用前必须要初始化,否则计算机会把内存中随机的一个数赋值给变量,从而导致结果无意义

6.表达式 :“=”是赋值运算符,有运算符的式子就叫做表达式  赋值表示一个动作

eg:a=b  即把b的值赋给a

7.字节是用于计量存储容量的一种计量单位,并且是硬件所能访问的最小单位,一个字节存储8位无符号数,储存的数值的范围为0~255

8.负数在计算机中以其绝对值的补码形式表达

9.十进制:传统的写法

十六进制:前面加0x或0X

八进制:前面加0

10.单个字符用 ‘  ’扩起来  eg:‘A’

字符串用“  ”括起来   eg: "AB"  ,"A"表示’A‘和‘\0’的组合

11.ASCII是一种规定,规定了不同字符用哪个整数去表示  eg:A=65,a=97

二、输入,输出函数

一、 printf 

用于输出函数,将变量的内容输出到显示器上

一、四种用法、

1、printf(“字符串\n”,);  \n表示换行  eg printf(“HELLO WORD!\n”);

2、printf("输出控制符\n",输出参数);  eg  printf(“%d”,i) d是十进制

3、printf(“输出控制符1,输出控制符.....2\n”,输出参数1,输出参数2....);

输出控制符和输出参数要一 一对应

4、printf(“输出控制符,非输出控制符\n,输出参数”);

二.  输出控制符如下:

    1、%d-------int      2、%ld------long  int       3、%c------char      4、%f------float   

    5、%lf-------double    6、%x(或%X或%#X)-----int、long  int、short  int

    7、%o------同6       8、%s------字符串

三、%x  %X....的区别

#include<stdio.h>
int main()
{
	int i = 47;   //x为16进制
	printf("%x\n", i);  //输出结果是2f
	printf("%X\n", i);   //输出结果是2F
	printf("%#x\n", i);   //输出结果是0x2f
	printf("%#X\n", i);   //输出结果是0x2F  %#X推荐使用

	return 0;
}

二、scanf

将数据输入到变量中

   用法 1、scanf("输入控制符",输入参数);    eg:scanf("%d",&i);    //&i 表示i的地址,&是取地址符

         2、scanf("非输入控制符,输入控制符",输入参数); 非输入控制符要原样输入

 1、使用是scanf前最好用printf提示用户以什么样的方式输入

2、 scanf尽量不要用非输入控制符,尤其是\n

3、在中间可以用一个代码把用户之前输入的数据全部消除,以便后面的输入数据

#include<stdio.h>
int main()
{
	int i;
	char ch;
	scanf_s("%d", &i);
	printf("i=%d\n", i);

	while ((ch = getchar()) != '\n')
		continue;       //这个代码消除了用户之前所输入的数据

	int j;
	scanf_s("%d", &j);
	printf("j=%d\n", j);

	return 0;
}

三、运算符

   一、算术运算符

假设变量 A 的值为 10,变量 B 的值为 20,则:

运算符描述实例
+把两个操作数相加A + B 将得到 30
-从第一个操作数中减去第二个操作数A - B 将得到 -10
*把两个操作数相乘A * B 将得到 200
/分子除以分母B / A 将得到 2
%取模运算符,整除后的余数B % A 将得到 0
++自增运算符,整数值增加 1A++ 将得到 11
--自减运算符,整数值减少 1A-- 将得到 9

以下实例演示了 a++ 与 ++a 的区别:

#include <stdio.h>
 
int main()
{
   int c;
   int a = 10;
   c = a++; 
   printf("先赋值后运算:\n");
   printf("Line 1 - c 的值是 %d\n", c );
   printf("Line 2 - a 的值是 %d\n", a );
   a = 10;
   c = a--; 
   printf("Line 3 - c 的值是 %d\n", c );
   printf("Line 4 - a 的值是 %d\n", a );
 
   printf("先运算后赋值:\n");
   a = 10;
   c = ++a; 
   printf("Line 5 - c 的值是 %d\n", c );
   printf("Line 6 - a 的值是 %d\n", a );
   a = 10;
   c = --a; 
   printf("Line 7 - c 的值是 %d\n", c );
   printf("Line 8 - a 的值是 %d\n", a );
 
}
以上程序执行输出结果为:
先赋值后运算:
Line 1 - c 的值是 10
Line 2 - a 的值是 11
Line 3 - c 的值是 10
Line 4 - a 的值是 9
先运算后赋值:
Line 5 - c 的值是 11
Line 6 - a 的值是 11
Line 7 - c 的值是 9
Line 8 - a 的值是 9

二、关系运算符

下表显示了 C 语言支持的所有关系运算符。假设变量 A 的值为 10,变量 B 的值为 20,则:

运算符描述实例
==检查两个操作数的值是否相等,如果相等则条件为真。(A == B) 为假。
!=检查两个操作数的值是否相等,如果不相等则条件为真。(A != B) 为真。
>检查左操作数的值是否大于右操作数的值,如果是则条件为真。(A > B) 为假。
<检查左操作数的值是否小于右操作数的值,如果是则条件为真。(A < B) 为真。
>=检查左操作数的值是否大于或等于右操作数的值,如果是则条件为真。(A >= B) 为假。
<=检查左操作数的值是否小于或等于右操作数的值,如果是则条件为真。(A <= B) 为真。

三、逻辑运算符

一、下表显示了 C 语言支持的所有关系逻辑运算符。

假设变量 A 的值为 1,变量 B 的值为 0,则:

运算符描述实例
&&称为逻辑与运算符。如果两个操作数都非零,则条件为真。(A && B) 为假。
||称为逻辑或运算符。如果两个操作数中有任意一个非零,则条件为真。(A || B) 为真。
!称为逻辑非运算符。用来逆转操作数的逻辑状态。如果条件为真则逻辑非运算符将使其为假。!(A && B) 为真。

eg:

#include <stdio.h>
 
int main()
{
   int a = 5;
   int b = 20;
   int c ;
 
   if ( a && b )
   {
      printf("Line 1 - 条件为真\n" );
   }
   if ( a || b )
   {
      printf("Line 2 - 条件为真\n" );
   }
   /* 改变 a 和 b 的值 */
   a = 0;
   b = 10;
   if ( a && b )
   {
      printf("Line 3 - 条件为真\n" );
   }
   else
   {
      printf("Line 3 - 条件为假\n" );
   }
   if ( !(a && b) )
   {
      printf("Line 4 - 条件为真\n" );
   }
}

当上面的代码被编译和执行时,它会产生下列结果:

Line 1 - 条件为真
Line 2 - 条件为真
Line 3 - 条件为假
Line 4 - 条件为真

二、c语言中对真假的处理

非零是真     零是假

真是1表示  假是0表示

&&左边的表达式为假时,右边的表达式肯定不会执行

||  左边的表达式为真时,右边的表达式肯定不会执行

四、赋值运算符

一、下表列出了 C 语言支持的赋值运算符:

运算符描述实例
=简单的赋值运算符,把右边操作数的值赋给左边操作数C = A + B 将把 A + B 的值赋给 C
+=加且赋值运算符,把右边操作数加上左边操作数的结果赋值给左边操作数C += A 相当于 C = C + A
-=减且赋值运算符,把左边操作数减去右边操作数的结果赋值给左边操作数C -= A 相当于 C = C - A
*=乘且赋值运算符,把右边操作数乘以左边操作数的结果赋值给左边操作数C *= A 相当于 C = C * A
/=除且赋值运算符,把左边操作数除以右边操作数的结果赋值给左边操作数C /= A 相当于 C = C / A
%=求模且赋值运算符,求两个操作数的模赋值给左边操作数C %= A 相当于 C = C % A
<<=左移且赋值运算符C <<= 2 等同于 C = C << 2
>>=右移且赋值运算符C >>= 2 等同于 C = C >> 2
&=按位与且赋值运算符C &= 2 等同于 C = C & 2
^=按位异或且赋值运算符C ^= 2 等同于 C = C ^ 2
|=按位或且赋值运算符C |= 2 等同于 C = C | 2

ps:1、优先级别:算术>关系>逻辑>赋值

      二、除法(/)和取余(%)

除法的运算结果和运算对象的数据类型有关,两个数都是int,则商就是int,若商有小数部分则会抛弃掉小数部分,被除数和除数只要有一个或两个是浮点数,则商也是浮点型,不截取小数部分

eg:16/5=3   16/5.0=3.20000  -13/4=-4

取余的运算对象必须是整数,结果是整除后的余数其余数的符号与被除数相同

eg:13%3=1  13%-3=1   -13%3=-1  -13%23=-13   3%5=3

五、控制流程

、控制流程是程序代码执行的顺序

2、流程控制的分类   顺序  选择   循环

3、选择:有选择的执行某些代码

分类: if    ,  switch

二、选择

    一、if

   1、 if最简单的用法: 

if (表达式)

语句               (表达式为真,语句执行,表达式为假,语句不执行)

2、if的范围:if 默认的只能控制一个语句的执行与否     (后面的else同理)

3、  if(表达式)

{

语句a

语句b

......

 }             (此时 if  可以控制大括号内的语句a和b)

4、if...else的用法

 #include <stdio.h>
 
int main()
{
   int i,j;
   scanf("%d %d",&i,&j);
   if(i>j)
   printf(“i大于j\n”);
   else  //else即否则的意思
    printf("j大于i\n");
     
    return 0;
}

5、if ... else if....else的用法

 #include <stdio.h>
 
int main()
{   
    int x
    scanf("%d",&x);
    if(x>0)
    printf("有两个解\n");
    else if(x==0)
    printf("有唯一解\n");
    else
    printf("无解\n");
     
    return 0;
}

ps:判断一个数的范围时,不能写成 90<=x<=100(该语句恒为真),应写成 90<=x&&x<=100       

二、switch  

个 switch 语句允许测试一个变量等于多个值时的情况。每个值称为一个 case,且被测试的变量会对每个 switch case 进行检查。

#include <stdio.h>
 
int main ()
{
   /* 局部变量定义 */
   char grade = 'B';
 
   switch(grade)
   {
   case 'A' :
      printf("很棒!\n" );
      break;
   case 'B' :
   case 'C' :
      printf("做得好\n" );
      break;
   case 'D' :
      printf("您通过了\n" );
      break;
   case 'F' :
      printf("最好再试一下\n" );
      break;
   default :
      printf("无效的成绩\n" );
   }
   printf("您的成绩是 %c\n", grade );
 
   return 0;
}

case相当于入口,brreak相当于出口

执行时根据swith内表达式的值找到相应的case子句,并从该子句开始往下执行

而break的功能是退出swith语句去执行它下面的语句

三、循环

循环:某些代码会被重复执行

分类:  for   、  while    、do....while    、break和continue

一、for

一单个for的使用:

for(.1.;..2.;..3..)

语句a           ( 1- 2- a- 3 - 2- a - 3 - 2 - a - 3.............)

for的范围问题同 if 一样

eg:求10以内奇数的和

#include <stdio.h>

int main()
{
    int i;
    int sum = 0;
    for (i = 1; i < 10; i += 2)    // i+=2等价于i=i+2//
        sum = sum + i;

    printf("%d\n", sum);
    return 0;
}

四、多个for循环的嵌套使用

for(1;2;3)

     for(4;5;6)

         语句a;

for(外循环的初始;外循环的条件;外循环的表达式)
    for(内循环的初始;内循环的条件;内循环的表达式)
          语句a
    
相当于把第二个for循环看作第一个for循环所控制的一个语句

顺序   1--2--内循环(内循环结束后退出)--3--2--内循环--3--2--内循环--3--2........

       内循环 和单个for循环一样

五、无限循环

如果条件永远不为假,则循环将变成无限循环。for 循环在传统意义上可用于实现无限循环。由于构成循环的三个表达式中任何一个都不是必需的,您可以将某些条件表达式留空来构成一个无限循环。

#include <stdio.h>
 
int main ()
{
   for( ; ; )
   {
      printf("该循环会永远执行下去!\n");
   }
   return 0;
}

可以按 Ctrl + C 键终止一个无限循环。

二、while循环

    一、格式: 

                      while(表达式)

                      语句a;

同样默认控制一个语句

eg:

int sum=0;

int i =1;

while(i<101)

{   

          sum=sum+i;

           ++i;

}

等价于

    int i;
    int sum = 0;
    for (i = 1; i < 101; ++i)
        sum = sum + i;
 

while 和 for 可以相互转换

即              for(1;2;3)

                  A;

等价于        1;

                    while(2)

                 {

                    A;

                    3;

                  }

二、 do...while

格式:

do

{

语句.....

}   while(表达式);

执行顺序: 语句-- while(表达式)  (为真)--语句-- while(表达式)--语句-- while(表达式)....

do...while并不等于while和for

eg:求一元二次方程的解

#include<stdio.h>
#include<math.h>
int main()
{
	double a,b,c;
	double x1, x2;
	double delta;
	char ch;


	do
	{
		printf("请输入一元二次方程的三个系数\n");
		printf("a=");
		scanf_s("%lf", &a);
		printf("b=");
		scanf_s("%lf", &b);
		printf("c=");
		scanf_s("%lf", &c);
		delta = b * b - 4 * a * c;
		if (delta > 0)
		{
			x1 = (-b + sqrt(delta)) / (2 * a);  //sqrt表示开根号
			x2 = (-b - sqrt(delta)) / (2 * a);
			printf("方程有两个解,%lf,%lf\n", x1, x2);
		}
		else if (0 == delta)
		{
			x1 = x2 = (-b) / (2 * a);
			printf("方程有唯一解x1=x2=%lf\n", x1);
		}
		else
			printf("方程无解\n");
		printf("你想继续吗(Y/N)\n");
		scanf_s(" %c", &ch);   //%c前面必须加一个空格

	} while ('y' == ch || 'Y' == ch);

	return 0;
}

四、break和continue

一、break

break如果拥有循环是用来终止循环

break如果用于swith则是用于退出(终止)swith

break不能直接用于if,除非 if 属于循环内的一个子语句

#include<stdio.h>
int main()
{
	int i;
	for (i = 0; i < 3; ++i)
	{
		if (i > 1)
			break;    //break虽然是属于if内的语句,但是作用是终止外部的for语句
		printf("hello\n");

	}


	return 0;

 break用于多个for循环嵌套,则它只能终止距离它最近的循环

同样break用于多层swith,它只能终止距离它最近的swith

二、continue

用于跳过本次循环余下的语句,转去判断是否需要执行下次循环

六、数组

int  a[5]={1,2,3,4,5};

上面定义了一个数组

a是数组的名字,5表示数组元素的个数

并且这5个元素按顺序分别用  a[0]  a[1]   a[2]   a[3]    a[4] 表示

功能:可以用来保存大量同类型的数据

  二、一维数组

为n个变量连续分配存储空间

所有变量的数据类型必须相同

所有变量所占的字节大小必须相等

有关数组的一些操作:

初始化

    完全初始化   int a[5]={1,2,3,4,5};

    不完全初始化  int a[5]={1,2,3};  未被初始化的元素自动为零

    不初始化    所有的元素都是垃圾值

    清零     int  a[5]={0} ;       将里面所有元素变为零

错误写法

int   a[5];

a[5]={1,2,3,4,5};

只有在定义数组的同时才可以整体赋值

     

   

   一些琐碎的知识

一、强制类型转换

(数据类型)(表达式)  可以将后面的数据强制转化为前面的数据类型

eg:for(i=1;i<=100;++i)

sum=sum+ 1/i

因为1和i都是整形,所有结果会舍弃小数,使得结果恒为0

此时可以写成  1/ (float)(i)  最好可以写成1.0 /i

可以将后面的1/i转换为浮点数,从而保留小数

eg     (int)(4.5+2.2)  最终值是6

         (float)(3+2)     最终值是5.00000

二、浮点数存错所带来的问题

float和double都不能保证可以精确的存储一个小数

eg、有一个浮点型变量x,如何判断x的值是否为0

if(  |x-0.00001| <0.00001)

是0

else

不是0

ps:循环更新的变量不能定义为浮点型

三、自增(自减)

前自增----  ++i

后自增----  i++

相同之处:最终都使 i 的值加1

不同之处:++i 整体表达式的值是 i 加1之后的值

                  i++整体表达式的值是 i 加1之前的值

  1、我们编程时要尽量避免前自增和后自增的差别

  2、最好  i++和++i 单独成为一个语句,不要把他作为一个完整复合语句的一部分使用

四、运算符补充

1、三目运算符

格式           A?B:C

等价于         if(A)

                         B;

                 else

                          C;

二、逗号表达式

格式    (A,B,C,D)

功能: 1、从左到右执行

            2、最终表达式的值是最后一项的值

                         

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值