数组长度问题
#include<string.h>
int main() {
char arr[6] = "abcdef"; //数组已满,就不会再自动添加'\0'了
char arr2[6] = "abcde";
printf("%d\n", strlen(arr)); //随机值
printf("%d\n", sizeof(arr)); //为6
printf("%d\n", strlen(arr2)); //为5
return 0;
}
一个全局变量不给初始化的话,默认会被初始化为0。但是一个局部变量不给初始化的话,就会默认是随机值,而且有的编译器不会通过,会报错。
#include<stdio.h>
int a; //会默认为0
int main() {
int b;
printf("%d\n", a);
printf("%d\n", b); //会报错,使用了未初始化的局部变量“b”
return 0;
}
几种类型0的含义
'0' 字符0 ascii码值是48
'\0' 转义字符 ascii码值是0
0 数字0
EOF --- end of file --- 文件结束标志 -> -1
在c语言的定义中为 #define EOF -1 ,所以EOF的值就是-1
#include<stdio.h>
int main() {
if (EOF == -1) {
printf("成功");
}
// 会打印成功
return 0;
}
c语言中0就是假,非0就是真
#include<stdio.h>
int main() {
int a = 10;
int b = !a;
printf("%d\n", b); //0
int c = 0;
b = !c;
printf("%d\n", b); //1
return 0;
}
int b = (++a) + (++a) + (++a)在编译器和环境不同时,结果也不同
#include<stdio.h>
int main() {
int a = 1;
int b = (++a) + (++a) + (++a);
//在VS中,会先计算三个++a,最后计算两个加号,即 b = (4) + (4) + (4)=12
//在linux中,会先计算前两个++a,然后计算第一个加号,然后计算最后一个++a,再计算最后一个加号
//即 b = ((3) + (3)) + (4) = 10
printf("%d", b); //vs中是12,但是linux下是10
return 0;
}
逗号表达式
#include<stdio.h>
int main() {
int a = 1;
int b = 3;
int c = 4;
int d = (a = b - 3, b = a * 2, c = a - b); //逗号表达式,从左向右依次计算
//此时 a = 0, b = 0,c = 0
//整个表达式d的结果是最后一个表达式的结果,即 d = c = a - b;
printf("%d\n", d);
int e = a = 1 + 2;
printf("%d\n", a); //3
printf("%d\n", e); //3
return 0;
}
()为函数调用操作符
#include<stdio.h>
int main() {
printf("hello"); //()为函数调用操作符
//()的操作数是函数名printf,第二个就是"hello"
return 0;
}
auto是修饰局部变量的关键字,但是平常都会省略
#include<stdio.h>
int main() {
auto int a = 10; //auto为修饰局部变量的关键字,但是平常使用都会省略,写成 int a = 10;
printf("%d", a);
return 0;
}
register为寄存器关键字,起到一个建议作用,建议将修饰的变量的值存放到寄存器中。
寄存器变量是不能取地址的,因为存放在内存里面的变量才会有地址,而寄存器是直接集成在cpu上的,所以没有地址。
#include<stdio.h>
int main() {
register int num = 10; //起到一个建议作用,建议将num的值放在寄存器中,最终是由编译器决定的
printf("%d", num);
return 0;
}