赞
踩
一、运算符 1. 算术运算符:+(加)、-(减)、*(乘)、/(除)、%(取模) 2. 关系运算符:>(大于)、<(小于)、>=(大于等于)、<=(小于等于)、==(等于)、!=(不等于) 3. 逻辑运算符:&&(逻辑与)、||(逻辑或)、!(逻辑非) 1、2、3所介绍的和数学想法相同。 4. 位运算符:&(按位与)、|(按位或)、^(按位异或)、~(按位取反)、<<(左移)、>>(右移) 按位与(&):对两个二进制数的每一位进行与操作,只有当两个二进制数的对应位都为1时,结果的对应位才为1,否则为0。 按位或(|):对两个二进制数的每一位进行或操作,只要两个二进制数的对应位中有一个为1,结果的对应位就为1,否则为0。 按位异或(^):对两个二进制数的每一位进行异或操作,只有当两个二进制数的对应位不同时,结果的对应位才为1,否则为0。 按位取反(~):对一个二进制数的每一位进行取反操作,即将每一位的0变为1,1变为0。 左移位(<<):将一个二进制数的所有位向左移动指定的位数,移出的位数将被丢弃,空出的位补0。 右移位(>>):将一个二进制数的所有位向右移动指定的位数,移出的位数将被丢弃,空出的位补0或1,取决于原数的符号位。
- #include <stdio.h>
-
- int main() {
- int a = 10; // a的二进制表示为 0000 1010
- int b =1; //b二进制为 0000 0001
- int c=a&b;//c为0000 0000
- int d=a|b;//d为0000 1011
- int e=a^b;//e为0000 1011
- int f=~a; //f为-11,与补码知识相关
- int g = a << 2; // 左移2位,相当于将a的二进制表示向左移动2位
- int h = a >> 2; // 右移2位,相当于将a的二进制表示向右移动2位
- printf("a = %d\n", a);
- printf("b = %d\n", b);
- printf("c = %d\n", c);
- printf("d = %d\n", d);
- printf("e = %d\n", e);
- printf("f = %d\n", f);
- printf("g = %d\n", g);
- printf("h = %d\n", h);
-
-
-
- return 0;
- }
上述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(数组数据类型);
数组的越界:超过数组的存储范围即为数组的越界。
- #include <stdio.h>
- #include <string.h>
-
- int main(){
- int aa[19];
- memset(aa,0,sizeof(aa));
- printf("初始化数组aa成功\n");
- char bb[12];
- memset(&bb,0,sizeof(bb));
- printf("初始化数组bb成功\n");
- strcpy(bb,"ssidhusd");
- printf("字符串为%s",bb);
- return 0;
-
- }
*****补充:
变量名++; // 表示在本次使用变量后再自增;
* ++变量名; // 表示在本次使用变量前自增;
* 变量名--; // 表示在本次使用变量后再自减;
* --变量名; // 表示在本次使用变量前自减;
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站码道有农。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。