目录
今天突然想起来一句话,你哭过的事情终有一天会笑着说出来.
转义字符
#include <stdio.h>
int main()
{
//转义字符
//\n换行符
printf("-------\n");
//横向制表符
printf("------\t-------\t----\t\n");
printf("-------\t-----\t------\t\n");
//回车 可以作为类似输入 光标移动到行首
//printf("输入姓名:\n");
//printf("_______\r");
//char str[20] = "";
//scanf_s("%s", str,20);
//类似功能还有\b退格
printf("输入姓名:___\b\b\b");
char str[20] = "";
scanf_s("%s", str, 20);
//问号 百分号 反斜杠 单引号 双引号
printf("\?,%%,\\,\',\"\n");
//其他的转义符基本没卵用,实际上除了\n\t其他的都没卵用
return 0;
}
"0",'0','\0',0,null
#include <stdio.h>
int main(int argc,char * argv[])
{
//刚才想到一个比较经典的问题
printf("%d\n", '0'); //输出的是0对应的ASCII码 48
printf("%u\n", "0"); //输出的是字符串"0"在地址中存储的位置(字符串两字节'0'和'\0')
printf("%d\n", 0); //输出的是0
printf("%d\n", '\0'); //输出的是0
printf("%d\n", NULL); //输出的是0
printf("%p\n", 0); //输出的是0000 0000也就是地址中的0号位置
printf("%p\n", '\0'); //输出的是0000 0000也就是地址中的0号位置
printf("%p\n", NULL); //输出的是0000 0000也就是地址中的0号位置
return 0;
}
类型转换
#include <stdio.h>
int main(int argc,char * argv[])
{
//自动转换确定安全性,需要向上转换
//有符号和无符号
int num = -20;
unsigned int num2 = 10;
printf("%d\n", num + num2); //-10
//计算机是以补码的形式进行存储
printf("%u\n", num + num2); //一个很大的数 -10补码是一个很大的数字
if (num + num2 > 0)
printf("num + num2 > 0\n"); //这条语句会输出,自动转换会将有符号转换为无符号
//char和short
char ch = 10;
short num3 = 10;
printf("%d\n", sizeof(ch + ch)); //4 为了防止溢出会自动提升为int
printf("%d\n", sizeof(num3 + num3)); //4 为了防止溢出会自动提升为int
printf("%d\n", sizeof(ch + num3)); //4 为了防止溢出会自动提升为int
return 0;
}
运算符
#include <stdio.h>
int main(int argc,char * argv[])
{
//位运算
int num = 4;
//左移乘2
printf("%d\n", num << 1); //8
//右移除2
printf("%d\n", num >> 1); //2
char num2 = -4;
//有些编译器在num为负数的时候这时结果为 1111 0011
//也就是1000 0100 变为 1111 0010 会在末尾加1 称为算数右移(编译器行为)
printf("%d\n", num2 >> 1); //-2
//按位与
//起到清0的作用,任何数和0相与都是0
char ch = 12; //二进制位为 0000 1100
//两个十六进制数表示一位,十六进制方便和二进制转换(不借用工具)
printf("%d\n", ch & ~(0x04)); //0000 1100 & 1111 1011 = 0000 1000 结果为8
//还可以使用移位来做,这样代码可读性更高
printf("%d\n", ch & ~(1 << 2)); //结果和上面一样
//按位或
//起到置1的作用,任何数和1相或都是1
char ch2 = 12;
printf("%d\n", ch2 | (1 << 1)); //0000 1100 | 0000 0010 = 0000 1110 结果为14
//异或运算
//a ^ b = c(a ^ b)
//a ^ c = a ^ (a ^ b) = b
//b ^ c = b ^ (a ^ b) = a
//可以交换两个不在同一地址上的变量,同一地址上会被清0
int a = 10;
int b = 20;
a ^= b;
b ^= a;
a ^= b;
printf("%d\t%d\n", a, b); //a = 20 ,b = 10
//三目运算符
//a > b ? c : d a>b为条件,成立返回c,否则返回d
printf("%s\n", 5 > 3 ? "true" : "false"); //true
//自增自减
//符号在前面,会先自增自减,再运算 ++a
//符号在后面,会先运算,再自增自减 a++
//a++ + ++a + b-- + --b等于多少,这种问题本身没有标准答案,不同的编译器可能会有不同的结果
int num3 = 1;
printf("%d\n", ++num3); //2
int num4 = 1;
printf("%d\n", num4++); //1
//再次输出num4值为2
printf("%d\n", num4); //2
num3 = 2;
num4 = 2;
num3++;
++num4;
//当自增自减独立存在的时候结果是一样的,前置的效率会高于后置
printf("%d\t%d\n", num3, num4); //3 3
return 0;
}
指定字面值类型
本来都准备睡了,突然想起来这个结果又爬起来搞完。
#include <stdio.h>
#include <stddef.h>
int main(int argc,char * argv[])
{
//指定字面值类型
//前缀
wchar_t str = L"a";
char16_t str2 = u"a";
char32_t str3 = U"a";
char str4 = u8"a";
//后缀
unsigned int num = 10u;
unsigned long num2 = 10ul;
unsigned long long num3 = 10ull;
float num4 = 1.1f;
long double num5 = 1.1l;
return 0;
}