【C】Re03

一、变量

变量存储了两个东西:

1、内存空间地址

2、内存空间存放的值

本质是给内存地址起了一个别名,允许我们通过别名对内存进行访问

void variable01() {
    int a = 100;
    printf("a -> %d
", a);
}

int main() {
    variable01();
    return EXIT_SUCCESS;
}

1、不进行赋值调用问题

void variable02UseWithoutAssign() {
    int a;
    printf("a -> %d
", a);
}

int main() {
    variable02UseWithoutAssign();
    return EXIT_SUCCESS;
}

CLion允许程序正常执行,编辑区域会显示淡黄警告提示

如果是VS则不允许程序执行,没有赋值的变量不允许使用

如果声明的这个变量不知道应该赋值多少,就和CLion一样默认赋值0

2、变量声明前后问题

C允许变量可以在调用的函数之后赋值,语法:

void variable03EarlyUse() {
    extern int sss;
    printf("sss been early use with extern keywords -> %d
", sss);
}

int sss = 1000;

int main() {
    variable03EarlyUse();
    return EXIT_SUCCESS;
}

在写的时候发现,即使extern不声明int 数据类型,也是可以执行的,但是编译器输出有看到错误提示:

warning: type defaults to 'int' in declaration of 'ssss' [-Wimplicit-int]

extern关键字的作用

告诉编译器这个变量的定义在后面,如果提前使用了,引导程序先找到变量的定义

再回到函数中继续执行下一行,如果寻找的变量不存在。程序终止

error: 'sss' undeclared (first use in this function); did you mean 'ssss'?

但是请不要这样使用,程序的可读性很差,书写混乱

二、常量

在程序运行中不可发生改变的值

但是C语言的常量存在五种形式:

1、字面值数值常量:

我们命名的变量在进行赋值时所使用的字符数值

除了整数100或者20这样的,同时实数也算常量,实数就是小数

2、字面值字符常量

字母,转义字符,都时字符常量

3、字符串常量

和字符常量一致,除了单引号和双引号的区别

4、符号常量

宏常量的定义

5、Consti定义

const int aa = 22200;

三、关键字 & 标识符

C程序预先对一些关键字做出了程序的预定义

参考知乎

https://zhuanlan.zhihu.com/p/77474834

四、数据类型

void dataType() {
    short varA = 100; // 32768
    int varB = 100;
    long varC = 100;
    long long varD = 100;

    printf("short -> %hd
", varA);
    printf("int -> %d
", varB);
    printf("long -> %ld
", varC);
    printf("long -> %lld
", varD);
}

1、有符号与无符号整型区别?

void signedAndUnsigned() {
    signed short varA = 327680;
    unsigned short varB = 327680;
    printf("varA -> %d
", varA);
    printf("varB -> %d
", varB);
}

int main() {
    signedAndUnsigned();
    return EXIT_SUCCESS;
}

五、SizeOf使用

可以直接对数据类型获取字节占用数

void sizeofUsage() {
//    sizeof 用来查看数据类型占用的字节大小
    printf("dataType int size is -> %llu
", sizeof(int));
    printf("dataType short size is -> %llu
", sizeof(short));
    printf("dataType long size is -> %llu
", sizeof(long));
    printf("dataType long long size is -> %llu
", sizeof(long long));
    printf("dataType float size is -> %llu
", sizeof(float));
    printf("dataType double size is -> %llu
", sizeof(double));
}

int main() {
    sizeofUsage();
    return EXIT_SUCCESS;
}

sizeof 也可以是一个变量来获取

int s = 2222;
printf("%d", sizeof(s));

六、Char字符型

void charDataType() {
    char newLine = '
';
    char oneCharacter = 'a';
    printf("ch -> %c 
", oneCharacter);
    printf("newLine -> %d 
", newLine); // 以整型查看会被强转输出
}

int main() {
    charDataType();
    return EXIT_SUCCESS;
}

 大小写转换:

void lowerAndUpperTransform() {
    char ch = 'e';
    printf("this character char -> %c but int -> %d
", ch, ch);
//    int n = (int) ch;
    ch = ch - 32;
    printf("after change, char -> %c but int -> %d
", ch, ch);
}

int main() {
    lowerAndUpperTransform();
    return EXIT_SUCCESS;
}

七、浮点型

void floatDataType() {
    printf("%d
", sizeof(3.14));
    printf("%d
", sizeof(3.14f));
}

int main() {
    floatDataType();
    return EXIT_SUCCESS;
}

格式化输出的一些操作:

void floatDataType() {double aa = 12.123456789;

    printf("%f
", aa); // 单精度 %f
    printf("%lf
", aa); // 双精度  %lf

    printf("%.2f
", aa); // 单精度 %f 指定小数保留位,并具有四舍五入
    printf("%.4f
", aa); // 双精度  %lf 指定小数保留位
}

int main() {
    floatDataType();
    return EXIT_SUCCESS;
}

八、字符串类型

void stringDataType() {
    printf("string -> %s
", "Hello String");
    printf("string -> %d
", sizeof("Hello String")); // 拆分单个字符进行字节占用计算
    // 虽然字符只有12个,但是实际上还有一个的标志 表示这个字符串的结束
    printf("string -> %s
", "HelloString"); // 从这里输入将只保留Hello后续的字符串不计入了
}

int main() {
    stringDataType();
    return EXIT_SUCCESS;
}

字符串变量:

void stringDataType2() {
    // 字符串,就是字符组成的数组 (Strings)
    char str[] = "Strings";
    printf("(%s)
", str);
    // 等同于这样的数组,但是单独打印输出会发现多出这么一个东西 (Strings �)
    char str3[] = {'S','t','r','i','n','g','s'};

    // 现在的合并打印会一起看到这个:(StringsStrings)
    printf("(%s)
", str3);
}

int main() {
    stringDataType2();
    return EXIT_SUCCESS;
}

九、SCANF 输入:

void scan01() {
    int num = 0;
    printf("num mem-addr -> %x
num value -> %d
", &num, num);
    printf("Input Tips: balabala...");
    // 第二参数需要注入一个变量的地址,变量存储了值和地址,但是要获取地址的话,使用&前缀实现
    scanf("%d", &num);
    printf("num mem-addr -> %x
num value -> %d
", &num, num);
}

 

原文地址:https://www.cnblogs.com/mindzone/p/13931548.html