C语言笔记第二天

目录

转义字符

"0",'0','\0',0,null

类型转换

运算符

指定字面值类型


今天突然想起来一句话,你哭过的事情终有一天会笑着说出来.

转义字符

#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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值