鹏哥C语言操作符[Ch1]

1:‘/’ 运算符两侧至少有一个浮点数时候结果才产生的是浮点数,与值存入的类型无关;

2:‘%’取模操作符(求余)两端必须是整数;

3:‘<<’左移操作符,移动的是数值二进制位;“左边丢弃、右边补零”

#include <stdio.h>
int main()
{
	int a = 2;
	int b = a << 1;
	printf("b=%d", b);
	return 0;
}

4:‘>>’右移操作符分为算术右移(右边丢弃、左边补原符号位)与逻辑右移(右边丢弃、左边补补零);

#include <stdio.h>
int main()
{
	int a = -10;
	int b = a >> 1;
	printf("b=%d", b);
	return 0;
}

注意:左移或者右移时本身数的值不会改变;

5:负数二进制的存储:

原码:按照数值写出的二进制形式即为原码;

反码:符号位不变、剩余位按位取反;

补码:符号位改变,剩余位不变;(负数是以补码形式存放的)

6:&按位与,|按位或、^按位异或

(1):按位与

#include <stdio.h>
int main()
{
	int a = 3;
	int b = 5;
	int c = a & b;
	printf("c=%d", c);
	return 0;
}

(2):按位或

#include <stdio.h>
int main()
{
	int a = 3;
	int b = 5;
	int c = a | b;
	printf("c=%d", c);
	return 0;
}

(3):按位异或         异或(相同为零、相异为1)

#include <stdio.h>
int main()
{
	int a = 3;
	int b = 5;
	int c = a ^ b;
	printf("c=%d", c);  
	return 0;
}

注意:按位与 按位或 按位异或 的操作对象必须为整数;

eg:合理使用逻辑运算符可以在不创建第三个变量的情况下完成两个变量值的交换;

#include <stdio.h>
int main()
{
	int a = 3;
	int b = 5;
	printf("a=%d b=%d\n", a, b);
	 a = a ^ b;
	 b= a >> 1;
	 a = a ^ b;
    printf("a=%d ", a);
	printf("b=%d ", b);  
	return 0;
}

7:赋值操作符:

(1):直接赋值:'='

(2):复合赋值法:+=、-=、*=、&=、|=、^=等操作符称为复合操作符;

eg:a=a+10;等价于 a+=10;

8:单目操作符:只有一个操作数;

!、-、+、&、sizeof(操作数类型长度)、~(二进制按位取反)、--、++分为前置和后置;、*、(强制类型转换)

注意sizeof是当作操作符来使用的

#include <stdio.h>
int main()
{
	char arr[10] = {};//char 每个占一个字节;int 每个占四个字节;
	printf("%d", sizeof(arr));
	printf("%d", sizeof(int [10])); int [10]表示的是数组类型;
	return 0;
}

sizeof()括号内的表达式不参与运算;

#include <stdio.h>
int main()
{
	short s = 5;
	int a = 10;
	printf("%d\n", sizeof(s = a + 10));
	printf("%d", s);
}

该代码打印结果是2;5;第一个printf打印的是short s 的所占字节数,即时将int类型的放入short类型之中,但是会产生截断,因此short s 的字节数仍然为2;

第二个printf打印的是s的值;打印的值仍然为s的最初赋值;因为sizeof()括号内的表达式不参与程序运算;

‘~’按位取反操作符

#include <stdio.h>
int main()
{
	int a = -1;
	int b = ~a;
	printf("%d", b);
	return 0;
}

该代码输出结果为零;因为负数在存储时候存储的是它的补码,-1的补码全为1按位取反后为0;

9:取地址操作符 &:

#include <stdio.h>
int main()
{
	int a = 5;
	printf("%p\n", &a);
	int * ad = &a;
	*ad = 6;
	printf("%d", a);
	return 0;
}

*ad:“解引用操作符”直接通过地址改变a的值;

int *ad =&a 中的*ad表示的是ad是一个指针变量;

10:(强制类型转换操作符)

#include <stdio.h>
int main()
{
	int a = (int)6.66;
	printf("%d", a);
	return 0;
}

11:关系运算符

!=,>=,<=,==,<,>;

注意判断是否相等的“==” 操作符不能在比较两个字符串的时候使用;

12:逻辑操作符

逻辑与:&&、逻辑或:||

#include <stdio.h>
int main()
{
	int a = 5;
	int b = 6;
	if (a && b)//逻辑与与逻辑或只用来判断真假;
	{
		printf("hehe\n");
	}
	return 0;
}

 使用时候需要注意区分按位与和按位或的区别;逻辑与和逻辑或判断的是真假;按位与和按位或是针对的二进制来说;

eg:

#include <stdio.h>
int main()
{
	int i = 0,a = 0,b = 2,c = 3 ,d = 4;
	i = a++ && ++b && d++;
	printf("a=%d\n b=%d\n c=%d\n d=%d\n",a,b,c,d);
	return 0;
}

注意:本代码输出结果为1,2,3,4

因为表达式i=a++&&++b&&d++;执行的时按位与符号当第一位操作数为0时候;表达式就不往后执行了,因此代码输出结果为a=1,b=2,c=3,d=4;

同理当遇到逻辑或的时候:比如“a||b||c”当a为真的时候后面针对b和c的操作就不再执行了;

 13:条件操作符:三目操作符;

表达式1 ? 表达式2 :表达式3

当表达式1为真的时候,整个表达式的值为表达式 2的值;当表达式1为假的时候整个表达式的值为表达式3的值;  

14:逗号表达式:

#include <stdio.h>
int main()
{
	int a = 5;
	int b = 3;
	int c = 0;
	int d = (c = 5, a = b + c, b = a - 2, c = a + b);
	printf("%d", c);
	return 0;
}

逗号表达式int d = (c = 5, a = b + c, b = a - 2, c = a + b);括号中从左到右依次计算,但整个表达式的值为最后一个表达式的值;因此本代码输出的结果为:d=14;

15:下标引用操作符:数组名+索引值eg:arr[1]

 16:结构成员访问和点操作符(结构体.成员名):

定义或者创建自定义类型:

#include <stdio.h>
struct Book//创建了一个自定义类型
{
	char name [10];
	char id  [10];
	int price;
};
int main()
{
	int num = 10;
	struct Book b = { "cyuyan","AbCd",50 };
	printf("书名:%s ID:%s 价格:%d",b.name,b.id,b.price);
	return 0;
}

首先使用struct 创建一个自定义类型,然后分别给其增加内容,如:书名、书号、价格等、然后在主函数中对书名、书号、价格进行内容的填充、再使用点操作符b.name、b.id、b.price对其中的内容进行打印;

 同样也可以使用指针来打印结构体中的内容;具体代码如下:

#include <stdio.h>
struct Book//创建了一个自定义类型
{
	char name [10];
	char id  [10];
	int price;
};
int main()
{
	int num = 10;
	struct Book b = { "cyuyan","AbCd",50 };
	struct Book*pb=&b;
	printf("书名:%s   ID:%s   价格:%d",pb->name,pb->id,pb->price);
	return 0;
}

17:整型提升的意义:

  表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运算器(ALU)的操作数的字节长度一般就是int的字节长度,同时也是CPU的通用寄存器的长度。因此,即使两个char类型的相加,在CPU执行时实际上也要先转换为CPU内整型操作数的标准长度。通用CPU 是难以直接实现两个8比特字节直接相加运算(虽然机器指令中可能有这种字节相加指令)。所以,表达式中各种长度可能小于int长度的整型值,都必须先转换为int或unsigned int,然后才能送入CPU去执行运算。

#include <stdio.h>
int main()
{
	char a = 3;
	char b = 127;
	char c = a + b;
	printf("%d", c);
	return 0;
}

 该段代码输出的结果为-126;因为发生了整型提升;char占一个字节,表示的二进制位几位8位;a=00000011;b=011111111;c=10000010;此时打印的时候使用的是%d,因为char没有达到int类型的大小,因此发生整型提升;最终计算结果为:10000000 00000000 00000000  11111110;即为-126;

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
下面是一个用C语言编写的最简单的操作系统的示例代码。它可以在x86架构的计算机上运行。这个操作系统只是一个简单的原型,它包括一个简单的内核和一个命令行界面。 ```c /* 内核入口函数 */ void kernel_main() { /* 从屏幕清除所有内容 */ clear_screen(); /* 打印欢迎信息 */ print_string("Welcome to my OS!\n\n"); /* 进入命令行界面 */ command_prompt(); } /* 命令行界面 */ void command_prompt() { char command[100]; while (1) { /* 打印命令提示符 */ print_string("> "); /* 读取命令 */ read_string(command); /* 处理命令 */ if (strcmp(command, "hello") == 0) { print_string("Hello, world!\n"); } else if (strcmp(command, "help") == 0) { print_string("Commands:\n"); print_string(" hello - Print 'Hello, world!'\n"); print_string(" help - Print this help message\n"); } else { print_string("Unknown command. Type 'help' for a list of commands.\n"); } } } /* 从屏幕清除所有内容 */ void clear_screen() { /* 在屏幕上输出空格字符 */ for (int i = 0; i < 80 * 25; i++) { print_char(' '); } /* 将光标移回屏幕左上角 */ set_cursor_position(0, 0); } /* 在屏幕上打印一个字符 */ void print_char(char ch) { /* 在VGA缓冲区中写入字符和属性 */ unsigned char *video_memory = (unsigned char *)0xb8000; *video_memory++ = ch; *video_memory++ = 0x0f; /* 将光标移动到下一个位置 */ move_cursor(); } /* 在屏幕上打印一个字符串 */ void print_string(const char *str) { /* 逐个打印字符串中的字符 */ while (*str) { print_char(*str++); } } /* 读取一个字符串 */ void read_string(char *buf) { char ch; /* 逐个读取字符,直到遇到换行符 */ do { ch = read_char(); if (ch == '\b') { /* 如果是退格符,则删除上一个字符 */ if (buf > 0) { buf--; print_char('\b'); } } else if (ch != '\n') { /* 否则将字符添加到缓冲区中 */ *buf++ = ch; print_char(ch); } } while (ch != '\n'); /* 在缓冲区末尾添加空字符 */ *buf = '\0'; } /* 读取一个字符 */ char read_char() { char ch; /* 等待输入缓冲区中有数据 */ while ((inb(0x64) & 0x01) == 0); /* 从键盘控制器中读取字符 */ ch = inb(0x60); /* 如果是扫描码则转换为ASCII码 */ if (ch >= 0 && ch <= 0x7f) { ch = keyboard_map[ch]; } return ch; } /* 每次在屏幕上输出一个字符后,将光标向后移动一格 */ void move_cursor() { /* 从VGA端口读取光标位置 */ unsigned short position; outb(0x0f, 0x3d4); position = inw(0x3d5); outb(0x0e, 0x3d4); position |= inw(0x3d5) << 8; /* 将光标位置向后移动一格 */ position++; /* 将光标位置写回VGA端口 */ outb(0x0f, 0x3d4); outw(position & 0xffff, 0x3d5); outb(0x0e, 0x3d4); outw((position >> 8) & 0xff, 0x3d5); } /* 设置光标位置 */ void set_cursor_position(int x, int y) { /* 计算光标位置 */ unsigned short position = y * 80 + x; /* 将光标位置写回VGA端口 */ outb(0x0f, 0x3d4); outw(position & 0xffff, 0x3d5); outb(0x0e, 0x3d4); outw((position >> 8) & 0xff, 0x3d5); } /* 比较两个字符串是否相等 */ int strcmp(const char *str1, const char *str2) { /* 逐个比较字符 */ while (*str1 && *str2 && *str1 == *str2) { str1++; str2++; } /* 如果两个字符串相等,返回0 */ if (*str1 == '\0' && *str2 == '\0') { return 0; } /* 如果第一个字符串小于第二个字符串,返回负数 */ if (*str1 < *str2) { return -1; } /* 如果第一个字符串大于第二个字符串,返回正数 */ return 1; } ``` 这个操作系统包含了一些常用的函数,如清空屏幕、打印字符和字符串、读取字符和字符串等。它还包含一个简单的命令行界面,可以处理几个简单的命令。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值