目录
操作符分类
算数操作符
移位操作符
- 移位操作符语法规范(<<):
- 原码反码补码简介
位操作符
- 简介
- 通过一个例子说明”位操作符“作用
- 异或运算的性质
赋值操作符
- 注意事项
- 复合赋值操作符
单目操作符
操作符详解
1.各种操作符介绍
2.表达式求值
H2 操作符分类
- 算术操作符
- 移位操作符
- 位操作符
- 赋值操作符
- 单目操作符
- 关系操作符
- 逻辑操作符
- 条件操作符
- 逗号表达式
- 下标引用,函数调用和结构成员
H2 算数操作符
加法操作符(+) 3. 减法操作符(-) 4. 乘法操作符(*) 5. 除法操作符(/) 6. 取模操作符(%)
|
若要得到浮点数结果,需要将操作数转换为浮点型什么意思
将操作数转换为浮点型意味着将整数操作数或其他数据类型的操作数转换为浮点数,以便在除法运算中得到浮点数结果。在C语言中,如果两个整数相除,结果会被截断为整数,即舍弃小数部分。为了得到精确的浮点数结果,需要将其中至少一个操作数转换为浮点数,这样可以避免丢失小数部分。转换操作数为浮点型可以通过将其赋值给浮点型变量或者使用类型转换操作符来实现。
听不懂
在C语言中,如果你用一个整数除以另一个整数,比如5 / 2,结果会是2而不是2.5。这是因为C语言默认会把两个整数相除的结果也当作整数处理。 所以,如果你想要得到浮点数的运算结果,比如5 / 2得到2.5,你需要将至少一个操作数转换成浮点数。做法是将其中一个操作数改为浮点类型,例如写成5.0 / 2或者5 / 2.0。这样就能够得到期望的浮点数结果。
那我想得到2.50是不是把5改成5.00
2024/2/25 12:59:05 是的,你可以将5改成5.00,这样在进行除法运算时就能得到2.50这样的浮点数结果。C语言会自动将小数点后面的0去掉,所以2.50会被显示为2.5。
浮点数是什么
浮点数是一种用来表示小数的数据类型。在C语言中,通常使用float或double关键字来声明浮点数变量。浮点数可以表示带有小数部分的数值,例如3.14、-0.001、等等。与整数不同,浮点数可以包含小数部分,因此在许多实际应用中,浮点数被用来表示需要更高精度的数值。
float和double区别
在C语言中,float和double是用来表示浮点数的两种数据类型。它们之间的主要区别在于存储精度和大小。 总的来说,如果对精度要求不是特别高,或者内存空间有限,可以选择使用float;而对于需要更高精度或者范围更广的数值计算,则建议使用double
|
H2 移位操作符
移位操作符是编程语言中用于对二进制数进行位移动的一类操作符。主要包括左移(<<)、右移(>>)和无符号右移(>>>)等几种。 只对整数适用小数不能移位操作 应用场景:
|
移位操作符语法规范(<<):
|
原码反码补码简介
整数的二进制表示有3种:源码反码和补码。
正数的原码反码补码相同;负数的原码反码补码需要计算
|
设计反码和补码的主要意义在于处理负数。使用原码表示负数时,加法和减法操作变得很复杂,因为需要单独的逻辑来处理符号位。 反码和补码的设计简化了负数的表示和运算: 这些编码方式的设计使得计算机可以更高效地进行整数的加减运算,同时简化了处理有符号整数的硬件设计。
|
因为正数源码补码相同所以源码就是
printf输出“14”
H2 位操作符
& //按位与 | //按位或 ^ //按位异或 注:它们的操作数必须是整数。 |
简介
通过一个例子说明”位操作符“作用
#include <stdio.h>
int main() { int a = 5; int b = 8;
printf("交换前:a = %d, b = %d\n", a, b);
// 使用异或操作交换a和b的值 a = a ^ b; b = a ^ b; a = a ^ b;
printf("交换后:a = %d, b = %d\n", a, b);
return 0; } |
上述代码首先定义了两个整型变量 a 和 b,并赋予它们初始值。然后通过三次异或操作实现了变量的交换。
运行该程序,输出结果为:
交换前:a = 5, b = 8 交换后:a = 8, b = 5 |
通过这种方法,不需要借助第三个临时变量就能够交换两个变量的值。
为什么能这样
这种交换变量的方法利用了异或操作的特性。具体来说,假设有两个变量 a 和 b:
因此,通过这三步操作,就成功地实现了不使用临时变量的情况下交换了变量 a 和 b 的值。
|
前置知识
异或运算的性质
异或运算是自身的逆运算,即 a ^ b ^ b = a。这句话什么意思 这句话的意思是,如果你对一个数连续进行两次与相同数值的异或运算,那么最终的结果将会回到原始的数值。这可以被通俗地解释为:假设有一个开关,每次按一下就会改变灯的状态,再按一下又会将其改回原来的状态。如果你连续按两次开关,最终灯的状态跟开始一样。
这些性质使得异或运算在编程中具有广泛的应用,包括加密解密、数据校验、交换变量值等方面。
|
对于与操作‘&’,和或操作‘|’ 它们都满足结合律。也就是说,对任意三个数 a、b、c,有: 与操作: 结合律:(a & b) & c = a & (b & c) 与操作也具有清零的特性,即 a & 0 = 0。//这意味着通过将一个数与0进行与操作,可以将其特定位清零。 或操作: 交换律: a | b = b | a此外, 结合律:(a | b) | c = a | (b | c) 恒等律:即 a | 0 = a。//这表示通过将一个数与0进行或操作会保持原值不变。
|
H2 赋值操作符
赋值操作符定义:
赋值操作符的注意事项:
最佳实践:
|
连续赋值理解:以a=b=c=5;改变c的值会不会影响a,b为例 如果使用 a = b = c 这样的赋值语句,它们各自存储着相同的值,而不是指向相同的内存地址。因此,修改其中一个变量的值不会影响其他变量。 例如,如果执行 b = 3,那么只有变量 b 的值会改变为 3,而 a 和 c 的值不会受到影响。因为在C语言中,赋值操作会将右边表达式的值复制一份给左边的变量,而不是共享相同的内存地址。 在连续赋值中,多个变量可以被同时赋予相同的值。当执行连续赋值时,赋值是从右向左进行的,这意味着右侧的表达式会首先计算,然后将结果传递给左侧的变量。 所以,在C语言中,连续赋值并不会导致变量之间共享数值或指向相同的内存地址。
|
复合赋值操作符
在C语言中,复合赋值操作符是一种便捷的方式,用于同时进行运算和赋值。这些操作符结合了算术运算符和赋值操作符,可以简化代码并使其更易读。 以下是几个常见的复合赋值操作符及其含义:
使用复合赋值操作符可以简化代码,并且有助于提高可读性。它们执行相应的运算并将结果赋给左侧的操作数,从而避免了重复输入变量名,提高了效率
|
H2 单目操作符
简介
什么是单目操作符?
- 双目操作符:类似‘+’,(a+b)有两个操作数(作用对象)的操作符
- 单目操作符:只有一个操作数的操作符
int(){
//单目操作符‘-’的使用。 int a = -10; int b = -a; printf("%d",a); printf("%d",b);
//取地址符‘&’ &a;//a占4个字节,每个字节都有一个地址,取地址符取出来的是第一个地址。
//我们用p来接受&a的值(p=&a) //p的类型怎么写呢--指针变量int* int* p = &a;
//sizeof也是一个操作符(运算符)计算类型或变量所占内存空间的大小,单位是”字节“ int n = sizeof(a);//也可以int n = sizeof(int);
return 0; } |
对二进制的一位进行定向修改 |
前置++和后置++
前置++
c复制代码 intx = 5; 后置++ c复制代码 intx = 5; 通过这些例子,可以更清楚地理解前置++和后置++运算符之间的区别。 注意:前置++和后置++都会改变变量的具体值
当涉及C语言中的前置++和后置++运算符时,以下是它们之间的主要区别: 总之++a(前置++)是先++,后使用;a++(后置++)是先使用后++。
|
先++,后使用,使用意思的理解
a--; 是一个表达式,先使用后-- 。(所以先打印) 但是在内置中例如for(i=0; i<a; i++); 这个i++和++i没区别(都是让i的值加一) |
H2 关系操作符
注意:不是所有的东西都能比较相等的 if(a==b);可以 if(“abc”==“acn”);不可比较 这样实际上是在比较两个字符串首元素地址 |
H2 逻辑操作符
&& “逻辑与” | | "逻辑或”
|
区分”按位与“和“逻辑与”,”按位或“和“逻辑或“
逻辑与和逻辑或,不关注二进制位,只关注真假。
例题
打印结果:a=1; b=2; c=3; d=4; 1.程序执行a++;先使用后++ 2.使用a=0;根据逻辑代数公式后面无意义直接忽略不执行; 3.执行++,a的值加1. 总结:打印结果a的值为1,其他变量还和原来一样不变。
|
打印结果:a=2;b=2;c=3;d=4;
简便记法 总结:对于逻辑与’&&‘,左边为假右边就不计算了;对于逻辑或’||‘,左边为真右边就不计算了
|
H3 逻辑表达式执行原理
c程序在逻辑表达式上是如何执行的,以 int a = 0, b = 2, c = 3, d = 4; int i = a++ || ++b || c++ || d++;为例
在C程序中,逻辑表达式按照短路求值规则执行。对于给定的表达式 int i = a++ || ++b || c++ || d++;,执行过程如下:
初始时,a = 0, b = 2, c = 3, d = 4。 首先计算 a++。由于递增操作符后置,所以这里会使用 a 的当前值(0),然后将 a 的值加一。因此,a++ 的结果为 0。 检查 a++ 是否为真。由于 0 被视为假,所以继续执行下一个操作数。 然后计算 ++b。这里 ++b 会使 b 的值加一,并且返回新的值。所以现在 b 的值为 3。 检查 ++b 是否为真。由于非零值被视为真,所以整个表达式的值就是真(1)了。 由于短路求值规则,在找到第一个为真的操作数后,后续的操作数就不再计算了。因此,c++ 和 d++ 不会被执行。 最终,变量 i 的值为 1(表示真)。而 a 的值为 1,b 的值为 3,c 的值为 3,d 的值为 4。 逻辑表达式顺序是从左往右执行
|
短路求值规则
详细通俗介绍短路求值规则
短路求值规则是指在逻辑表达式中,如果通过计算前面的部分就能够确定整个表达式的结果,那么后面的部分就不会再被计算(不执行)。这种机制类似于遇到“短路”一样,提前结束后续计算。
举个简单的例子,假设有一个逻辑表达式 A && B(表示 A 与 B 都为真时整个表达式才为真),如果 A 的值为假,那么无论 B 的值是什么,整个表达式都将为假。因此,在这种情况下,B 的值就不会被计算,因为已经可以确定整个表达式的结果了。
同样地,对于逻辑或表达式 A || B(表示 A 或者 B 任意一个为真时整个表达式就为真),如果 A 的值为真,那么整个表达式就为真,这时候就不会再计算 B 的值了。
总之,短路求值规则可以帮助程序在判断逻辑表达式时尽可能地节省计算资源,提高执行效率。
|
H2 条件操作符
简介
条件操作符(Conditional Operator),也称为三元运算符,是一种在许多编程语言中都存在的特殊操作符。在C语言中,条件操作符的形式为
condition ? expr1 : expr2。这个表达式首先计算 condition(条件) 的返回值(真假)。如果 condition(条件) 为真,则整个表达式的值为 expr1;否则,整个表达式的值为 expr2。
以下是条件操作符的总结报告:
- 语法:条件操作符的语法是 condition ? expr1 : expr2,其中 condition 是一个要求得到真或假值的表达式,expr1 和 expr2 则是根据 condition 的值而选择的两个可能的结果。
理解 int a = 10; int b = (a > 5) ? 100 : 200; // 如果 a 大于 5,b 被赋值为 100,否则被赋值为 200 注意不是把后面的值赋给a,而是赋给整个()里的表达式,condition是判断依据,而expr1和expr2是两个待定的(整个表达式)返回值 |
- 作用:条件操作符提供了一种简洁的方式来表示基于条件进行选择的逻辑,避免了使用 if-else 语句时的冗余性。
- 执行顺序:条件操作符是从左往右执行的。首先计算 condition 的值,然后根据 condition 的值来确定返回 expr1 还是 expr2。
- 适用范围:条件操作符通常用于需要根据条件来选择不同行为的情况,例如在赋值语句中根据条件来选择不同的值。
- 注意事项:使用条件操作符时需要谨慎,确保表达式清晰易懂。过度复杂的条件操作符可能会影响代码的可读性。
总的来说,条件操作符是一种便捷的方法,可以根据条件快速地选择不同的值或行为,但需要适度使用以保持代码的可读性。
条件操作符提供了一种简洁的方式来表示基于条件进行选择的逻辑,避免了使用 if-else 语句时的冗余性,这是什么意思通俗的讲讲 当我们需要根据某个条件来选择不同的值或执行不同的操作时,通常会使用 if-else 语句。条件操作符提供了一种更简洁、更紧凑的方式来表达这种逻辑。 举个例子,假设我们有一个变量 age,如果 age 大于等于 18,我们想要给变量 status 赋值为 "成年",否则赋值为 "未成年"。使用 if-else 语句,我们可能会这样写:
|
条件操作符应用
- 比大小
int a = 1, b = 2; int max = (a > b ? a : b); printf("%d", max);
|
H2 逗号表达式
对于代码2 if(a=b+1,c=a/2,d>0);//()内为逗号表达式 /*逗号表达式,前两项要算(要执行),真正承担判断作用的是最后一项(因为逗号表达式会返回最后一项的值)*/
先执行一些语句再进行判断
|
H2 下标引用 函数调用 和 结构成员
H3 下标引用操作符 []
简介
下标引用操作符[]用于访问数组中的元素,其基本形式为array[index]。在C语言中,该操作符允许我们通过数组名和一个整数索引来访问数组的特定元素。例如,arr[5]表示数组arr中的第6个元素(数组索引从0开始)。另外,在C语言中由于数组名和下标操作符之间的关系是通过指针运算实现的,所以
表达式arr[i]等价于*(arr + i)。
此外,在C语言中也可以使用ptr[index]访问指针指向的内存中的元素,其中ptr是指针,index是偏移量。
总之,下标引用操作符[]在C语言中为我们提供了一种方便的方式来访问数组和指针指向的元素。
举个例子
调试结果
c语言,int arr[10]={0}; arr[7] = 7; 7[arr]=9; 为什么还可以这样写 2024/3/10 15:47:44
在C语言中,数组名和下标操作符[]之间的关系是通过指针运算来实现的。因此,对于arr[7]和7[arr]来说,它们都等价于*(arr+7)和*(7+arr)。这是因为a[b]在C语言中被定义为*(a+b),所以a[b]和b[a]是等价的。因此,在C语言中,你可以像arr[7]一样使用7[arr],因为它们本质上是相同的表达式。
那可以写成[7]arr=7;吗 在C语言中,数组名通常位于方括号之前,表示对数组元素的引用。因此,写成[7]arr=7;这样的语法是不正确的,并且会导致语法错误。在C语言中应该使用arr[7]=7;来给数组的第8个元素赋值为7。 [arr]7=9;可以这样写吗 在C语言中,表达式[arr]7=9;是不合法的。在C语言中,方括号内应该是用来表示数组索引的,而不是用来作为变量名或者其他标识符的。因此,这种写法会导致语法错误。正确的写法应该是arr[7]=9;来给数组的第8个元素赋值为9。
总结:
|
H3 函数调用操作符
int Add(int x,int y) { return x + y; } int main(){ int a = 1; int b = 2; int c = Add(a , b);//Add函数名后面的小括号‘()’,就是函数调用操作符 return 0; } /*函数调用操作符不可省略,而sizeof(a)= sizeof a 可以省略,就说明sizeof不是函数,证明他是操作符*/ /*既然()是操作符,那么它的操作数(操作对象),是函数Add,以及参数a,b【操作数至少有一个就是函数名,参数可以没有 nop();】*/
函数调用操作符()允许我们在程序中调用函数以执行其中的代码,就像按下了某个按钮一样。
|
H3 结构成员访问操作符