2308-初识C语言part1

初识C语言:

一个项目只有有一个main函数!,否则会报错

1.main函数。程序保存为.c

复制代码
//int——返回类型(整型),main——函数名,{ }——函数体。

#include <stdio.h>

int main()

{

//在屏幕打出hello world

printf('hello world\n');//printf——库函数——屏幕打印信息,需要引用头文件stdio.h

// \n表示换行

return 0; 

}
复制代码

2.数据类型

char  //字符数据类型,1 byte

short  //短整型,2 byte

int  //整形, 4 byte

long  //长整型,4 byte

longlong  //更长的整形,8 byte

float  //单精度浮点数,4 byte

double  //双精度浮点数,8 byte

 1字节(byte) = 8比特(bit)

常量、变量(全局,局部)

%d 整型

%f float

%lf double

复制代码
#define _CRT_SECURE_NO_WARNINGS 1//防止vs警告scanf
#include <stdio.h>
int age = 1;//此处age为全局变量
int main()
{
    char ch = 'a';//char字符类型
    int age = 20;//整形,此处age为局部变量。当局部和全局变量名字一样,局部优先
    short num = 100;//短整型,long,longlong
    float weight = 66.6;//浮点型, double
    printf("%d\n", 100);//打印整数
    printf("%d\n", sizeof(int));//sizeof - 关键字 - 操作符 - 计算类型或者变量所占空间的大小
    //---------------------
    int x = 0;
    int y = 0;
    int sum = 0;
    scanf("%d %d", &x, &y);//需要输入x的数值,enter后输入y的值,最后会自动给出sum
    sum = x + y;//求和
    printf("sum = %d\n", sum);
    return 0;
}
复制代码

要注意scanf是需要输入的,否则就是个白框!

3.变量的作用域和生命周期

局部变量:作用域为变量所在的局部范围,生命周期(变量的创建和销毁之间的时间段)同

全局变量的作用域:整个工程(项目),生命周期为整个程序

对于同一工程(项目),两个不同.c源文件,在一个文件中定义某变量int g_val后,在另一文件使用extern int g_val即可调用

 执行性代码如printf必须放在 { } 里,如main函数

复制代码
#include <stdio.h>
int b = 2021;//全局变量
int main()
{
    printf("1:%d\n",b);//第1次打印b,成功
    {
        printf("2:%d\n", b);//第2次打印b,成功
        int a = 10;//{ }内为局部变量a的作用域,故在{ }外a无法打印
        printf("a = %d\n", a);
    }
    printf("3:%d\n", b);//第3次打印b,成功
    return 0;
}
复制代码

4.常量

复制代码
 1 #include <stdio.h>
 2 enum Sex//变量Sex的所有可能取值,其子集为常量
 3 {
 4     Male,//若此处改为Male=10,则后面打印Male为10,Female为11
 5     Female//常量
 6 };
 7 int main()
 8 {
 9     //---1.字面常量---
10     3.14;
11     10;
12     "a";
13     "abcdef";
14 
15     //---2.const修饰的常变量---
16     int num = 10;//前面加const 会使得num为常量导致不能改动,下一行报错
17     num = 20;
18     printf("num = %d\n", num);//输出num = 20
19 
20     int arr[10] = {0};//10个元素
21     //这里[ ]内必须为常量,如10,不能为const常变量,或者变量
22 
23     //---3.#define 定义的标识符常量---
24     #define MAX 10000//#define 定义的标识符常量MAX=10000
25     //若再写MAX = 20000;会报错,已给MAX常量赋值,不能重新赋值
26     int n = MAX;
27     printf("n = %d\n", n);
28 
29     //---4.枚举常量(可以一一列举的常量)---
30     //在第二行定义了枚举常量
31     printf("%d\n", Male);//第一个值默认输出为0
32     printf("%d\n", Female);//第二个值默认输出为1
33     return 0;
34 }
复制代码

5.字符串+转义字符+注释

5.1 字符串

使用:调试——窗口——监视。

字符为单引号'a',字符串为双引号"abc"。

由双引号(Double Quote)引起来的一串字符称为字符串字面值(String Literal),或者简称字符串。
注:字符串的结束标志是一个0 的转义字符。在计算字符串长度的时候 0 是结束标志,不算作字符串内容。

复制代码
 1 #include <stdio.h>
 2 #include <string.h>//含strlen函数
 3 int main()
 4 {
 5     "hello";//" "字符串
 6     char arr[] = "hello";//字符串在结尾隐藏了\0的字符,是结尾标志,在监视里能看到
 7     char arr1[] = "abc";//打印出abc
 8     char arr2[] = { 'a','b','c' };//结尾无\0会导致打印abc后面乱码,可以再加一个元素'\0'避免
 9     printf("%s\n", arr1);
10     printf("%s\n", arr2);
11     //求字符串长度 strlen()
12     int len = strlen("abc");//string length
13     printf("len = %d\n", len);//输出为3,因为长度不包含\0
14     printf("len1 = %d\n", strlen(arr1));//输出为3
15     printf("len2 = %d\n", strlen(arr2));//输出为随机值,arr2再加一个元素'\0'可避免
16     return 0;
17 }
复制代码

5.2 转义字符&注释

 转义字符:转变原来的意思

复制代码
 1 #include <stdio.h>
 2 int main()
 3 {
 4     printf("%s\n", "\"");//打印",\表示将后面一个符号作为元素看待
 5     printf("c:\\test\\test.c\n");
 6     //此处\t为转义字符,前面加一个\来变为元素,输出结果为c:\test\test.c
 7     printf("%c\n", '\130');//8进制的130等于10进制88,输出字符按照ASCii为X
 8     printf("%c\n", '\x30');//16进制,为48,输出为字符‘0’
 9     //int a = 1; //C++注释风格
10     /*
11     int b =2;
12     */    //C语言注释风格,不支持嵌套注释
13     return 0;
14 }
复制代码

例题:printf("%d\n", strlen("c:\test\328\test.c")); 输出为什么?

答:14,\t算一个字符,\32算一个。 

6. 选择、循环、函数、数组

6.1 if选择+while循环

复制代码
 1 #define _CRT_SECURE_NO_WARNINGS 1
 2 #include <stdio.h>
 3 int main()
 4 {
 5 //---if选择---
 6     int input = 0;
 7     printf("join us, will you learn(1/0)?\n");
 8     scanf("%d", &input);
 9     if (input == 1)//括号内为if条件
10         printf("good\n");
11     else
12         printf("bad\n");
13 //---while循环---
14     int line = 0;
15     while (line < 3000)
16     {
17         printf("写代码:%d\n", line);
18         line++;
19     }
20     if (line == 3000)
21     {
22         printf("good\n");
23     }    
24     return 0;
25 }
复制代码

6.2 函数

复制代码
 1 #define _CRT_SECURE_NO_WARNINGS 1
 2 #include <stdio.h>
 3 int Add(int x, int y)//设计函数Add(x,y)=x+y
 4 {
 5     int z = 0;
 6     z = x + y;
 7     return z;
 8 }
 9 
10 int main()
11 {
12     int num1 = 0;
13     int num2 = 0;
14     scanf("%d%d", &num1, &num2);
15     //int sum = num1 + num2;//使用非函数方法解决
16     int sum = Add(num1, num2);//函数方式解决
17     printf("%d\n", sum);
18     return 0;
19 }
复制代码

6.3 数组

数组 :一组相同类型的元素的集合

数组用下标(序号,从0开始)来访问

复制代码
 1 int main()
 2 {
 3     int i = 0;
 4     int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
 5     char ch[5] = { 'a', 'b', 'c' };
 6     while (i < 10)
 7     {
 8         printf("%d ", arr[i]);
 9         i++;
10     }
11     return 0;
12 }
复制代码

7.操作符

  • 算数操作符:+ - * / %
  • 移位操作符:>>  <<

(例:int a = 2; int b = a << 1; 左移操作符移动的是二进制位,a是整型4byte=32bit,即 a = 00...010,10前面30个零,

左移后变为 a = 00...0100,100前面29个零,即 a = 100,十进制为4,故b=4 )

  • 位操作符:& 按位与,   | 按位或,   ^ 按位异或
  • 赋值操作符:=  +=  -=  *=  /=  &=  ^=  |=  >>=  <<=

(例:a = a + 2 等效为 a += 2 ) 

单目操作符:只有一个操作数的操作符(如+是双目操作符,有a+b两个操作数)

 ! :printf("%d\n", !a); 0表示假,非零为真;若a为假,!a则为1(真),反之为0(假)

补充:一个整数的二进制表示有3种: 原码 反码 补码

原码

  原码就是用第一位表示符号,其余位表示值,比如如果是32位二进制:

    [+3]原码 = 0000 0000 0000 0000 0000 0000 0000 0011

    [-3]原码 = 1000 0000 0000 0000 0000 0000 0000 0011

  因为第一位是符号位,所以32位二进制整数的取值范围就是:

    [1111 1111 1111 1111 1111 1111 1111 1111 , 0111 1111 1111 1111 1111 1111 1111 1111]  ==> [-2147483647, 2147483647]

反码

  反码的表示方法是:

  *正数的反码是其本身

    *负数的反码是在其原码的基础上,符号位不变,其余各个位取反

    -3 原码 1000 0000 0000 0000 0000 0000 0000 0011
         反码 1111 1111 1111 1111 1111 1111 1111 1100

    +3 原码 0000 0000 0000 0000 0000 0000 0000 0011
      反码 0000 0000 0000 0000 0000 0000 0000 0011

补码

  补码的表示方法是:

  *正数的补码就是其本身

  *负数的补码是在其原码的基础上,符号位不变,其余各位取反,最后+1(即在反码的基础上+1)

     -3 原码 1000 0000 0000 0000 0000 0000 0000 0011
          反码 1111 1111 1111 1111 1111 1111 1111 1100
          补码 1111 1111 1111 1111 1111 1111 1111 1101

      +3 原码 0000 0000 0000 0000 0000 0000 0000 0011
        反码 0000 0000 0000 0000 0000 0000 0000 0011
          补码 0000 0000 0000 0000 0000 0000 0000 0011

~ :按位取反,把所有二进制位中0和1互换(包括符号位),如a = 2,码有32位

  1. 原码:00...010,
  2. ~操作后作所有元素零一互换:111...101
  3. 作为补码,然后补码——反码——原码输出:111..101——111...100——100...011即为-3
  4. 故 printf("%d\n",~a);输出为-3

++:前置++是先++,如++a。后置++是先使用再++,如a++

( ): 强制转换,例如(int)为强制转换为int

地址符 & 和 * 暂时不讲

  • 关系操作符:>=  <=  ==  !=  >  <
  • 逻辑操作符:&& 逻辑与  || 逻辑或
  • 条件操作符:三目操作符,如exp1 ?exp2 : exp3 表示:若exp1成立,得到exp2的结果,反之得到exp3结果
  • 逗号表达式:逗号分隔表达式,从左向右依次计算,整个表达式的结果是最后一个表达式的结果
  • 下标引用、函数调用和结构成员:

  [ ] 下标引用,例如 arr[5] 表示引用数组arr的第六个元素;

  ( ) 调用函数的时候,函数名后边的 ( ) 就是函数调用操作符,例如 printf("%d\n", a)有两个操作数,printf("aa")有一个操作数,还可以没有

  . 和 -> 暂时不讲

 

复制代码
 1 #define _CRT_SECURE_NO_WARNINGS 1
 2 #include <stdio.h>
 3 int main()
 4 {
 5     float a = 10.0 / 3;//小数点要用float,要打小数点
 6     printf("%f\n", a);
 7     int b = 9 % 2;//余数,得1
 8     //---sizeof---
 9     int c = 2;
10     printf("%d\n", sizeof(int));
11     printf("%d\n", sizeof(c));//两者都打印的是整型变量大小
12     int arr[10] = { 0 };
13     printf("%d\n", sizeof(arr));//数组大小为4,内含10个元素,故大小为40
14     printf("%d\n", sizeof(arr[0]));//每个元素大小为4
15     printf("%d\n", sizeof(arr) / sizeof(arr[0]));//40 ÷ 4 = 10
16     //---~---
17     printf("~c = %d\n", ~c);//按位取反,结果为-3
18     //--- ++ ---
19     int d1 = 10;
20     int e1 = ++d1;//前置++,先++后使用
21     int d2 = 10;
22     int e2 = d2++;//后置++,先使用后++
23     printf("d1 = %d\n", d1);//11
24     printf("e1 = %d\n", e1);//11
25     printf("d2 = %d\n", d2);//11
26     printf("e2 = %d\n", e2);//10
27     //---()---
28     int a1 = (int)3.14;//(int)为强制转换为int
29     printf("a1 = %d\n", a1);
30     //--- && ||---
31     int b1 = 0;
32     int b2 = 3;
33     int b3 = b1 && b2;
34     int b4 = b1 || b2;
35     printf("b3 = %d\n", b3);//0
36     printf("b4 = %d\n", b4);//1
37     //---?:---
38     int max = b1 > b2 ? b1 : b2;//比大小
39     printf("max = %d\n", max);//
40     //--- , ---
41     int x1 = 0;
42     int x2 = 3;
43     int x3 = 5;
44     int x4 = (x1 = x2 + 2, x3 = x1 - 4, x2 = x3 + 2);//逗号是从左到右依次计算,取最右端结果
45     printf("x4 = %d\n", x4);//x4 = 3
46     return 0;
47 }
复制代码

8.常见关键字

c语言提供的,不能自己创建关键字,变量名不能是关键字

auto: 局部变量前都有auto,但可省略,有其他用法暂时跳过

break:循环,switch等用到

register:寄存器关键字。

计算机的数据可以在:寄存器,高速缓存,内存,硬盘,网盘。速度从左到右依次变慢,空间相反。

define&include不是关键字,是预处理指令

typedef:类型重定义

复制代码
1 #include <stdio.h>
2 typedef unsigned int u_int;//重命名unsigned int为u_int
3 void test()
4 int main()
5 {
6     unsigned int num1 = 100;//两者一样
7     u_int num2 = 100;
8     return 0;
9 }
复制代码

static:静态,可修饰局部变量,全局变量,函数。

--------------------------------------------------------------

static修饰全局变量,使得只能在自己所在的源文件 (.c) 内部可以使用其他源文件不能使用!

全局变量,在其他源文件内部可以被使用,是因为全局变量具有外部链接属性但是被static修饰之后,就变成了内部链接属性,其他源文件就不能链接到这个静态的全局变量了

--------------------------------------------------------------

static修饰函数,使得函数只能在自己所在的源文件内部使用,不能在其他源文件内部使用

本质上: static是将函数的外部链接属性变成了内部链接属性!(和static修饰全局变量一样! 

 --------------------------------------------------------------

define定义宏:

复制代码
1 #include <stdio.h>
2 #define MAX 100//定义常量
3 #define ADD(X,Y) X+Y//定义宏,正确写法为((X)+(Y))
4 int main()
5 {
6     printf("%d\n", MAX);
7     printf("ADD = %d\n", 4 * ADD(2, 3));//4*2+3=11
8     return 0;
9 }
复制代码

 

posted @   积分三换  阅读(64)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
点击右上角即可分享
微信分享提示