当前位置:   article > 正文

今天学习C语言运算符以及数组有些细节_数组运算符是什么

数组运算符是什么
一、运算符
1. 算术运算符:+(加)、-(减)、*(乘)、/(除)、%(取模)
2. 关系运算符:>(大于)、<(小于)、>=(大于等于)、<=(小于等于)、==(等于)、!=(不等于)
3. 逻辑运算符:&&(逻辑与)、||(逻辑或)、!(逻辑非)
1、2、3所介绍的和数学想法相同。
4. 位运算符:&(按位与)、|(按位或)、^(按位异或)、~(按位取反)、<<(左移)、>>(右移)
    按位与(&):对两个二进制数的每一位进行与操作,只有当两个二进制数的对应位都为1时,结果的对应位才为1,否则为0。
    按位或(|):对两个二进制数的每一位进行或操作,只要两个二进制数的对应位中有一个为1,结果的对应位就为1,否则为0。
    按位异或(^):对两个二进制数的每一位进行异或操作,只有当两个二进制数的对应位不同时,结果的对应位才为1,否则为0。
    按位取反(~):对一个二进制数的每一位进行取反操作,即将每一位的0变为1,1变为0。
    左移位(<<):将一个二进制数的所有位向左移动指定的位数,移出的位数将被丢弃,空出的位补0。
    右移位(>>):将一个二进制数的所有位向右移动指定的位数,移出的位数将被丢弃,空出的位补0或1,取决于原数的符号位。

  1. #include <stdio.h>
  2. int main() {
  3. int a = 10; // a的二进制表示为 0000 1010
  4. int b =1; //b二进制为 0000 0001
  5. int c=a&b;//c为0000 0000
  6. int d=a|b;//d为0000 1011
  7. int e=a^b;//e为0000 1011
  8. int f=~a; //f为-11,与补码知识相关
  9. int g = a << 2; // 左移2位,相当于将a的二进制表示向左移动2
  10. int h = a >> 2; // 右移2位,相当于将a的二进制表示向右移动2位
  11. printf("a = %d\n", a);
  12. printf("b = %d\n", b);
  13. printf("c = %d\n", c);
  14. printf("d = %d\n", d);
  15. printf("e = %d\n", e);
  16. printf("f = %d\n", f);
  17. printf("g = %d\n", g);
  18. printf("h = %d\n", h);
  19. return 0;
  20. }
上述10按位取反得-11而不是5?

因为在计算机中,10默认是有符号整数类型,按位取反的结果是对10进行二进制补码表示后的按位取反结果。而10的二进制补码是 0000 1010,按位取反后得到 1111 0101,这个二进制数在二进制补码中表示的是 -11。因此,10按位取反的结果是-11,而不是5。

计算机表示负数的方法有:原码,补码,反码,但是一般采用补码表示。原因如下(自查得知):
1. 原码
在原码表示法中,最高位是符号位,0表示正数,1表示负数。其余位表示数值大小。例如,+5的原码为00000101,-5的原码为10000101。
原码的优点是符号位和数值位分开,直观易懂,但存在加减法中的溢出问题,而且0存在两种表示方法:00000000和10000000。
2. 反码
在反码表示法中,负数的表示方法与原码不同,负数的符号位为1,其余位是对应正数的按位取反。例如,+5的反码为00000101,-5的反码为11111010。
反码的优点是解决了0存在两种表示方法的问题,但是存在加减法中的进位问题。
3. 补码
在补码表示法中,负数的表示方法与反码相同,负数的符号位为1,其余位是对应正数的按位取反后再加1。例如,+5的补码为00000101,-5的补码为11111011。
补码的优点是解决了加减法中的进位问题,而且0只有一种表示方法:00000000。因此,在计算机中,一般采用补码来表示负数。
总的来说,原码、反码和补码都是计算机中用来表示负数的方法。其中,补码是最常用的一种方法,因为它可以解决加减法中的进位问题,而且0只有一种表示方法。
5. 赋值运算符:=(赋值)、+=(加等于)、-=(减等于)、*=(乘等于)、/=(除等于)、%=(取模等于)、&=(按位与等于)、|=(按位或等于)、^=(按位异或等于)、<<=(左移等于)、>>=(右移等于)
6. 条件运算符:? : (三目运算符)
例: (a>b)?a=1:b=1; a>b则a=1否则b=1.
7. 其他运算符:sizeof(返回数据类型的大小)、&(取地址运算符)、*(指针运算符)、->(结构体指针运算符)、( )(强制类型转换运算符)等。

*sizeof运算符:计算变量或者数据结构在当前系统中占用内存的>字节数。
 * 用法:1、用于数据类型:sizeof(数据类型);
 *            2、用于变量:sizeof(变量名)

二、C语言结构

 顺序结构,选择结构(if/switch)和循环结构(for while/do…while…)

1、顺序结构:按照C语言执行顺序执行。

2、选择结构:当满足某些条件时,执行某些语句。

3、循环结构:循环执行某些语句,直到不满足循环条件或者跳出循环

continue:跳出当前循环。break:跳出循环体。for循环更合适事先知道循环总次数的场景
 while循环更合适事先不知道循环总次数的场景

三,数组:使用memset进行初始化。memset(数组名,0,sizeof(数组名));

注意:使用数组的时候,编译器不会检查数组的下标是否正确,但是
在程序中下标一定不能越界,如果程序运行时数组下标越界,就相当于
访问了其它程序的内存,可能会导致程序异常中断(Core dump),后果非常严重。

字符串:字符串就是一个以空字符'\0'结束的字符数组,是一个特别
的字符数组,这是约定,是规则。空字符'\0'也可以直接写成0。
 字符串的初始化:可以使用初始化数组的方式初始化字符串。

字符串的赋值:可以使用strcpy函数。strcpy(字符串名,"需要输入的字符串");

char *strcpy(char *dest, const char *src);
dest是目标字符串,src是源字符串。上述两个函数均来自<string.h>头文件、。

函数的作用是将源字符串的内容复制到目标字符串中,并返回目标字符
串的起始地址。在复制时,会将源字符串的每个字符逐一复制到目标字
符串中,直到遇到字符串结束符'\0'。

字符串如果没有以\0结束,则无法使用%s输出,输出会显示乱码。
字符串以0结束,后面的部分会被丢弃。

字符串数组:以0结尾为字符串,再加上一维就是字符串数组。

一维数组的存储:当我们定义了一个数组,空间大小为n时,操作系统分配连续的内存地址来存储数组元素。但是地址大小差距为sizeof(数组数据类型);
 数组的越界:超过数组的存储范围即为数组的越界。

  1. #include <stdio.h>
  2. #include <string.h>
  3. int main(){
  4. int aa[19];
  5. memset(aa,0,sizeof(aa));
  6. printf("初始化数组aa成功\n");
  7. char bb[12];
  8. memset(&bb,0,sizeof(bb));
  9. printf("初始化数组bb成功\n");
  10. strcpy(bb,"ssidhusd");
  11. printf("字符串为%s",bb);
  12. return 0;
  13. }

*****补充:

        变量名++;    // 表示在本次使用变量后再自增;
 *     ++变量名;     // 表示在本次使用变量前自增;
 *      变量名--;    // 表示在本次使用变量后再自减;
 *      --变量名;     // 表示在本次使用变量前自减;

a=b+a和a+=b有什么区别?
`a=b+a`表示将`b`和`a`的和赋值给`a`,即先计算`b+a`的值,然后将这个值赋给`a`。
`a+=b`表示将`b`加到`a`上,并将结果赋给`a`,即先计算`a+b`的值,然后将这个值赋给`a`。
两个语句的区别在于是否改变`b`的值,`a=b+a`会保留`b`的值,而`a+=b`会改变`b`的值。

本人学过一点C语言,所以没有从头开始学习,有些方面并没有着手。学习up主为B站码道有农。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/613060
推荐阅读
相关标签
  

闽ICP备14008679号