c语言基础学习记录(自用)

150 阅读6分钟

  • 变量的声明与定义的区别:

1.定义变量 ,分配内存, 先定义,再使用 只能定义一次

2.声明变量 ,在其它地方已经被定义过, 使用前 extern 数据类型 变量名; 不分配内存 可以声明多


  • : return break continue的区别性

    1. return 在函数内使用 结束函数 返回结果
  •                   函数内有循环  也可以结束循环
    
    1. break 在switch中结束条件
  •                  循环中 结束当前循环
    
  • 3.continue 在循环中 结束当次循环 继续下次循环

    共同点:见到关键字,后面的语句不再执行


image.png


  • 常量:

(## 整数常量) 前缀指定基数:0x 或 0X 表示十六进制,0 表示八进制,不带前缀则默认表示十进制。

image.png

  • (1)字面量 :直接使用的量 直接量 1 2 -1 3.14f 3.14
  • (2)自定义常量
    const int a=10; // 必须赋初值 不能再修改 在函数内定义
  • 宏常量 函数外定义 #define 常量名 常量值 结束时不加分号 编程时不能重新赋值的
    预处理常量

*(3)系统常量


  • 数据类型

image.png


  • 枚举enum
#include <stdio.h>

enum DAY
{
    MON = 1, TUE, WED, THU, FRI, SAT, SUN
} day;
int main()
{
    // 遍历枚举元素
    for (day = MON; day <= SUN; day++) {
        printf("枚举元素:%d \n", day);
    }
}


  • 整数类型及其范围

image.png


image.png 如果数值过大,要注意字节长度进行更换


  • %取值方法

C 库函数 – printf() | 菜鸟教程

  • 可移植类型

#include <stdint.h>
-   int8_t,uint8_t: 8位有符号和无符号整数
-   int16_t,uint16_t:16位有符号和无符号整数
-   int32_t,uint32_t:32位有符号和无符号整数
-   int64_t,uint64_t:64位有符号和无符号整数
#include <inttypes.h>
//待学
[]([标准库 - inttypes.h - 《阮一峰《C 语言教程》》 - 书栈网 · BookStack](https://www.bookstack.cn/read/wangdoc-clang-tutorial/docs-lib-inttypes.h.md))

二进制计算方式:按位取反,末位加一

  • 快捷键

tab 缩进

shift+tab可缩退

ctrl k ctrl u 取消注释,也可以取消/*注释

ctrl +shift+ / 注释与取消“//”注释


  • tips

    • scanf_s等#define _CRT_SECURE_NO_WARNINGS
  1. 算数运算中可以在数字后加.0来输出浮点数例(a=6/5.0)

  2. 短路逻辑:在进行多项逻辑计算时,如果靠前的项已经能够决定该式子的结果,之后的项将不再执行

  3. init会首先被执行,且只会执行一次,increment是在运行完主体后才运行的。


 for ( init; condition; increment )
 { 
             statement(s);
}



某位设置为1用或|   设置为零用&和~   将某位取反用异或

1位运算练习
// 将变量a的第1位设置为1,其他位保持不变
uint8_t a = 0b10101001;  // 0xa9
a|=(1<<1);
// 将变量b的第3位设置为0,其他位保持不变
uint8_t b = 0b10101001;  // 0xa9
b&=~(1<<3);
// 将变量c的第7位取反,其他位保持不变
uint8_t c = 0b10101001;  // 0xa9
c^=(1<<7);
// 将变量d的第0位和第7位取反
uint8_t d = 0b10110011;  // 0xb3;
d^=(1<<0|1<<7);
// 检查变量e的第7位是否为1,如果是则输出"Bit is set",否则输出"Bit is not set"。
uint8_t e = 0b10110011; 

e = (e >> 7)&&1;
e=1?printf("Bit is set"):printf("Bit is not set");

  1. if (z==1||x==a||z==2*x-1) ||符号在判断中同样存在顺序问题 会按照从左到右的顺序判断

随机函数并非是真随机,加上srand函数可以实现更加公平的随机

#include <time.h>
#include <stdio.h>
srand((unsigned)time(NULL));
 int a = rand() % 3;

8.$ 符号可以用于文件的命名,而且可以放在命名开头


  • 问题

  • 如何输出特殊字符 例如%与\n
printf("%%%%%d",a);//%%输出%
printf("\\n");//在屏幕中输出\n

  • static的用法
静态变量在程序中只被初始化一次,即使函数被调用多次,该变量的值也不会重置。

全局声明的一个 static 变量或方法可以被任何函数或方法调用,只要这些方法出现在跟 static 变量或方法同一个文件中。

  • '\0'的意思
char ch2 = '\0';
printf("ch2=%c", ch2); //ch1=
printf("ch2=%d", ch2);// ch1=0
代表空

  • 1000 0000为什么表示128
一个字节中最高位是符号位,
所以,计算机中+0和-0的编码是不一样的,
+0的编码是:0000 0000;
-0的编码是:1000 0000。
于是将1000 0000规定为-128,这样就可以让有符号数多一个有用的数据点

  • 把十进制转化为二进制并输出
在计算机中,任何数据都可以用二进制来表示。
对于一个十进制数,我们可以通过不断地将其除以2,并记录余数来得到其二进制表示。
具体步骤如下:

1.  **初始化**:准备一个变量来存储当前的十进制数。
2.  **循环提取最低位**:通过位操作提取当前数的最低位(即该数与1进行按位与操作)。
3.  **右移操作**:将数右移一位,相当于将数除以24.  **记录结果**:将提取的最低位记录到数组或字符串中,作为该数的二进制表示的一部分。
5.  **重复步骤24**,直到数变为0。

#include <stdio.h>
#include <stdlib.h>
void decimalToBinary(int n) {
    if (n > 1)
        decimalToBinary(n / 2);
    printf("%d", n % 2);
}
int main() {
    int n;
    printf("请输入一个十进制数: ");
    scanf("%d", &n);
    printf("二进制表示为: ");
    decimalToBinary(n);
    printf("n");
    return 0;
    }

  • 如果我们有一个整型指针变量ptr,想要读取指针指向的值,可以使用scanf("%d", ptr)。





size_t 类型是什么

`size_t`的含义是*size type*,是一种计数类型。取值范围与机器架构与操作系统相关。32 位机器一般是`unsigned int`,占 4 字节;而 64 位机器一般是`unsigned long`,占 8 字节。

`size_t`类型常被用作计数用途,例如:`sizeof`运算符得到对象所占的字节数;字符串函数`strlen`返回字符串的长度等等,其返回值都为`size_t`类型。

`size_t`类型隐含着本机理论所能容纳建立最大对象的字节数大小的含义,因此常被用于数组索引、内存管理函数中。

最初设计`size_t`类型初衷,是为了程序的跨平台兼容性考虑。

当有符号整型和无符号整型进行运算时,有符号整型会先自动转化成无符号。-1转化成无符号数为4294967295

十六进制数有正负号吗?

不使用正负号
看首位是否<8,<8说明是正数,≥8说明是负数





为什么不能二次输入?

连续两次scanf获取输入,第一次输入后的回车符进入了缓冲区,导致了不能进行第二次的输入

image.png

可以通过使用getchar();清除缓冲区


刷题的作用就是,如果可以记下来解法,面对相同的问题时直接就可以拿来使用,而不需要再研究原理。