初试c语言之第二次笔记

初识c语言之第二次笔记

一:常量

1:字面常量

#include <stdio.h>
int main()
{
    
    
	//字面常量
    3.14;
   "abcdef";
   'a';
    return 0;
}

2: const 修饰常变量

注意:常变量不是常量,是常~变量

一开始不加const的时候,num被定义后可以直接修改变量

#include <stdio.h>
int main()
{
    
    
	int num = 100;
	num = 200;
	printf("%d ",num);//200
	return 0;
}

加了const之后

#include<stdio.h>
int main()
{
    
    
	const int num = 100;
	num = 200;
	printf("%d ",num);//err 不能直接修改
	return 0;
}

上面例子上的 num 被称为 const 修饰的常变量, const 修饰的常变量在C语言中只是在语法层面限制了变量 num 不能直接被改变,但是num本质上还是一个变量的,所以叫常变量。

插个小知识点——你知道头文件#include<stdio.h>中stdio.h的含义么?
std代表standard 标准,i代表input 输入,o代表output 输出
#include<stdio.h>也叫标准输入输出头文件

3:#define 定义的标识符常量

#include<stdio.h>
#define MAX 1000
int main()
{
    
    
	int a = MAX;
	printf("%d\n ",MAX); //1000
	MAX = 2000;//err


	return 0;
}

上述例子上的MAX被称为define定义的标识符常量,与const结果一样,define定义之后,MAX不能直接被改变。

4:enum 枚举常量

枚举常量比较少见,但还是稍微提一下。
生活中的枚举就是一一列举

#include<stdio.h>
enum Sex//一一列举
{
    
    
 //注:枚举类型中列举的可能取值都是枚举常量
    MALE,//内部储存为0
    FEMALE,//内部储存为1
    SECRET//内部储存为2
};//本代码的括号中MALE,FEMALE,SECRET是枚举常量
int main()
{
    
    
    //枚举常量演示
    printf("%d\n", MALE);
    printf("%d\n", FEMALE);
    printf("%d\n", SECRET);
    return 0;   
}

注意:枚举常量的默认是从0开始,依次向下递增1。如果把上述例子中的MALE,改成MALE=4,则FEMALE SECERT向下递增,打印出来的MALE FEMALE SECRET分别为4 5 6。

二:字符串、转义字符与注释

1:字符串

"hello world"
"a"
" "

这种由双引号引起来的一串字符称为字符串字面值,或者简称字符串。C语言没有字符串对应的数据类型。

注:字符串的结束标志是一个 \0 的转义字符。在计算字符串长度的时候 \0 只是结束标志,不算作字符串的内容。

下面的知识点是易错点!!! 体现出了\0的重要性

#include<stdio.h>
#include<string.h>//strlen库函数的头文件
int main()
{
    
    
    char arr1[]="abcdef";
    char arr2[]={
    
    'a','b','c','d','e','f'};
    //这两个数组定义一的方式一样吗?
    printf("%s\n",arr1);
    printf("%s\n",arr2);
    printf("%d\n", strlen(arr1));
    printf("%d\n", strlen(arr2));
    //strlen是一个库函数,string strlen的缩写,用来求字符串长度,统计的是\0之前出现了多少个字符
    //输出:
    //abcdef
    //(abcdef后面的部分随机(直到找到\0才停下来))
    //6
    //(随机值)
    //原因:arr1数组第7个元素为\0,而arr2数组只存储了6个字符,第一个可以找到
    //字符串的结束标志,而第二个找不到,只能不断地往后找直到找到\0,strlen函数以也以\0为结束的标志,但其不计算\0,原理相同
    return 0;    
}

2:转义字符

blog.csdnimg.cn/17667000e08b4e818aba5a4517e79dd7.png)

#include<stdio.h>
int main()
{
    
    
    // \? 在书写连续多个问号时使用,防止他们被解析成三字母词
    printf("(are you OK??)\n");
    //三字母词: ??) -> ]
    //输出:(are you OK]
    printf("(are you OK\??)\n");
    //如果改成(are you OK\??)就将\??转义为??
    //输出即为(are you OK??)
    // \' 用于表示字符',而不再被作为表示字符的符号
    // \" 用于表示一个字符串内部的双引号,
    // \\ 用于表示一个反斜杠,防止它被解释为一个转义序列符。
    printf("%c",'\'');
    //输出:'
    printf("\"");
    //输出:"
    printf("\\n");
    //输出:\n
    //这里的\将特殊字符转义为普通的字符,加上\表示转义后面的字符
    // \a 警告字符,蜂鸣,电脑会发出声音
    printf("\a");
    // \n 换行
    printf("\n");
    // \r 回车
    // \t 水平制表符 相当于键盘上的tab键
    // \ddd ddd表示1~3个八进制的数字。 如:\130 
    printf("%c",'\130');//注意这是一个字符
    // \xdd dd表示2个十六进制数字。 如:\x30 
    printf("%c",'\x63');//注意这也是一个字符
    return 0;
}

易错题:

printf("%d", strlen("c:\test\628\test.c"));

最后输出结果是14 因为\t是算一个字符, \62算一个字符,注意:在八进制中没有8(易错!!).
二进制:(0~1),
八进制:(0~7),
十进制:(0~9)
十六进制:(0~15)。

3:注释

在这里插入图片描述

三:选择语句

如果你好好学习,校招时拿一个好offer,走上人生巅峰。
如果你不学习,毕业等于失业,回家卖红薯。
这就是选择!

#include <stdio.h>
int main()
{
    
    
    int coding = 0;
    printf("你会去敲代码吗?(选择1 or 0):>");
    scanf("%d", &coding);
    if(coding == 1)
   {
    
    
       prinf("坚持,你会有好offer\n");
   }
    else
   {
    
    
       printf("放弃,回家卖红薯\n");
   }
    return 0;
}    

四:循环语句

有些事必须一直做,比如我们,日复一日的学习。

在C语言中如何实现循环呢?
while语句-这里简单提一下
for语句(后期讲)
do … while语句(后期讲)

//while循环的实例
#include <stdio.h>
int main()
{
    
    
    printf("加入比特\n");
    int line = 0;
    while(line<=20000)
   {
    
    
        line++;
        printf("我要继续努力敲代码\n");
   }
    if(line>20000)
        printf("好offer\n");
    return 0;
}

五:函数

#include <stdio.h>
int main()
{
    
    
    int num1 = 0;
   int num2 = 0;
    int sum = 0;
    printf("输入两个操作数:>");
    scanf("%d %d", &num1, &num2);
    sum = num1 + num2;//这个代码只能写两个数相加之和 比较有局限性,写成函数形式就比较方便
    printf("sum = %d\n", sum);
    return 0;
}
//上述代码,写成函数如下:
#include <stdio.h>
int Add(int x, int y)//int表示返回类型为整型,Add表示函数名,int x与int y表示形参的类型和命名
{
    
    
	int z = 0;
    z = x + y;
    return z;
}
int main()
{
    
    
    int num1 = 0;
    int num2 = 0;
    int sum = 0;
    printf("输入两个操作数:>");
    scanf("%d %d", &num1, &num2);
    sum = Add(num1, num2);
    printf("sum = %d\n", sum);
    return 0;
}

我们用生活中的例子来理解函数
在这里插入图片描述

上述例子中 num1与num2表示输入数据,Add表示函数,最后经过函数处理产出了一个结果z放到sum(产品)里面去。

那么函数是怎么调用的呢?

当代码走到了sum = Add(num1,num2);的时候 往int Add(int x,int y)那里走,把num1传递给x,把num2传递给y,算出x+y的值放到z里面,z再返回,将返回的值放到sum里面去,然后再打印。

六:数组

1:数组的定义

要存储1-10的数字,怎么存储?
C语言中给了数组的定义:一组相同类型元素的集合。

int arr[10] = {
    
    1,2,3,4,5,6,7,8,9,10};//定义一个整形数组,最多放10个元素

2:数组的下标

C语言规定:数组的每个元素都有一个下标,下标是从0开始的。

数组可以通过下标来访问的。

int arr[10] ={
    
    0};
//int表示这个数组的每个元素都是整型
//arr为数组名,[10]表示数组中共有10个元素
//={0}表示对数组进行初始化,使数组的第一个元素等于零

在这里插入图片描述

3:数组的使用

char ch1[5] = {
    
    0};//不完全初始化,剩余的默认为初始化为0
char ch2[] = {
    
    'a','b','c'};
char ch3[] = {
    
    0};//ch3里面只有一个元素——0

在这里插入图片描述

char ch = 0;//这个0实际上是\0,ASCII码值为0
int arr1[10] = {
    
    1,2,3,4,5,6,7,8,9,10};
printf("%d ", arr1[8]);//9
printf("%d\n", arr1[18]);//越界访问
int arr2[18] = {
    
    1,2,3,4,5,6,7,8,9,10};
printf("%d\n", arr[10]);//0,因为不完全初始化导致10后面全为0

输入10个值给数组

#include<stdio.h>
int main()
{
    
    
    int arr[] = {
    
    0};
    int i = 0;
    //while循环
    while(i < 10)
    {
    
    
    	scanf("%d ",&arr[i]);
    	i++;
    }
    i = 0;//i再次初始化
    while(i < 10)
    {
    
    
    	printf("%d ",arr[i]);
    	i++;
    }   
	return 0;
}

七:操作符

1:算术操作符

  +   -    *    /    %
#include<stdio.h>
int main()
{
    
    
    int a = 7/2//七除二得三余一,结果为三
    int b = 7%2//取模就相当于取余且取模操作符的左右数字只能是整数
    printf("%d\n",a);
    printf("%d\n",b);
    //输出:
    //3
    //1
    //此时得到的a与b均为整数运算得到的值
    float a = 7.0/2;
    //当我们输入2.0这样的浮点型常量时,编译器会默认其为double类型
    float b = 7/2.0;
    //当我们需要进行小数运算时,只需要除号的左右的数字其一为浮点数即可
    printf("%.1f\n",a);
    printf("%.2f\n",b);
    //%f用于打印float类型的数据,前面的.1表示小数点后保留一位,.2表示保留两位
    //输出:
    //3.5
    //3.50
    return 0;
}

2:移位操作符

    两个大于和两个小于     >>  <<

3:位操作符

&   ^   |

4:赋值操作符

=  +=   -=   *=   /=   &=   ^=  |=   >>=  

我们这里暂时只提部分

#include<stdio.h>
int main()
{
    
    
    int a = 10;
    a = 20;
    a += 5;//a加等于5,即表示a = a + 5;
    printf("%d",a);//25
    a -= 5;//a减等于3,即表示a = a - 5;
    printf("%d",a);//20    
    a *= 2;//等于a = a * 2; 
    return 0;   
}

5:单目操作符

其与双目操作符的区别
比如 2 + 3,2被称为左操作数,3被称为右操作数,有两个操作数我们就叫它双目操作符单目操作符实际上只有一个操作数

   !           逻辑反操作
   -            负值
   +            正值
   &            取地址
   sizeof       操作数的类型长度(以字节为单位)
    ~           对一个数的二进制按位取反
	--          前置、后置--
	++          前置、后置++
	 *          间接访问操作符(解引用操作符)
	 (类型)       强制类型转换

(1):!逻辑反操作符

在c语言中,如何表示真假?
答:0表示假,非0表示真

#include<stdio.h>
int main()
{
    
    
	int a = 10;
	if(a)//如果a为真
	printf("hehe\n");//非0为真,因此打印出hehe
	
	return 0;
}

(2):sizeof

#include<stdio.h>
int main()
{
    
    
    int arr[10]={
    
    0};
    printf("%d\n",sizeof(arr));//这里用%zu更严谨,%d也是可以的
    //计算整个数组的大小 40
    printf("%d\n",sizeof(arr[0]));
    //计算数组一个元素的大小 4
    printf("%d\n",sizeof(arr)/sizeof(arr[0]));
    //计算数组元素的个数 10
    int a = 0;
    printf("%d"sizeof(a));//这个地方的()是可以省略的,计算a的大小 4
    printf("%d",sizeof a);//这个代码也是正确的,内容一致 4
    //如果sizeof为函数则必须加上括号,
    //这里不加括号也是正确的,因此sizeof只是一个操作符而不是函数
    printf("%d\n",sizeof(int));
    //这个操作符也可以计算类型的大小 4
    //printf("%d\n",sizeof int);是不对的必须加括号
    return 0;
}

strlen 与 sizeof 的区别:

strlen 是库函数,只能针对字符串,求字符串长度,计算字符串中\0之前的字符个数
sizeof 是操作符,是计算所占内存空间的大小

(3):++ –

前置++与- -:先使用(打印),后++,- -
后置++与- -:先++,- -,后使用(打印)

#include<stdio.h>
int main()
{
    
    
    int a = 10;
    int b = a++;//先使用后++,表示先把10赋给b然后在在a的基础上加1
    // b=a;然后a=a+1;
    printf("%d %d\n",a,b);//11 10
    a = 10;
    int c = a--;//同样,先使用后--,表示先把10赋给c然后在在a的基础上减1
    // c=a;然后a=a-1;
    printf("%d %d\n",a,c);//9 10
    a = 10int d = ++a;//先++后使用,表示先在a的基础上加1再把11赋给b
    printf("%d %d\n",a,d);//11 11
    // a=a+1;然后d=a;
    a = 10;
    int e = --a;//同样,先--后使用,表示先在a的基础上减1再把9赋给b
    printf("%d %d\n",a,e);//9 9
    // a=a-1;然后e=a;
    a = 10;
    printf("%d\n",a--);//先使用,再--,所以打印出10
    printf("%d\n",a);//,减完之后为9,所以打印出9
    return 0;
}

(4):(类型)强制类型转换

#include<stido.h>
int main()
{
    
    
	int a = 3.14//err,int是整型
	//强制转换
	int a = (int)3.14;//指把3.14这个double类型的常量强制转化为int类型并赋值给变量a

	printf("%d\n",a);//打印3,浮点数强制类型转换为整数会丢失精度
	return 0;
}

6:关系操作符

特意强调下两个字符串的比较大小

#include<stdio.h>
int main()
{
    
    
	char arr1[] = "abcdef";
	char arr2[] = "abcdef";
	//两个字符串大小相等是不能用==的,应该用strcmp函数
	if(strcmp(arr1,arr2) == 0)
		printf("==\n");
	else
		printf("!=\n");
}
  大于:>
  大于等于:>=
  小于:<
  小于等于:<=下标引用、函数调用和结构成员:
  不相等:!=
  相等:==

7:逻辑操作符

逻辑与: &&
逻辑或: ||

8:条件操作符

如果第一个表达式exp1为真,则整个表达式的值为表达式exp2的值,否则整个表达式的值为表达式exp3的值

    exp1 ? exp2 : exp3
#include<stdio.h>
int main()
{
    
    
    int a = 10;
    int b = 5;
    printf("%d",a > b ? a : b);//a > b,a,b对应三个表达式
    //a>b成立,表达式的值为a的值
    //类似于选择语句,找出其中的较大值,输出为10
    a = 1;//此时我们改变a的值
    printf("%d",a > b ? a : b);
    //a>b不成立,表达式的值为b的值
    //输出为5
    return 0;   
}

9:逗号表达式

特点:从左向右依次计算,整个表达式的值是最后一个表达式的结果

  exp1, exp2, exp3, …expN
#include<stdio.h>
int main()
{
    
    
	int a = 3;
	int b = 5;
	int c = 0;
	int d = (a += 2,b = b - c + a,c = a + b);
	//       a = 5, b = 10,       c = 15  -> d     
	printf("%d\n",d);//15
	return 0;
}

10:下标引用、函数调用和结构成员

[]    ()     .    ->

其中一部分操作符涉及二进制的问题,我们先跳过

猜你喜欢

转载自blog.csdn.net/yanghuagai2311/article/details/125108839