1、短路
表达式1 && 表达式2:当表达式1为假时,整个式子肯定为假,编译器将不会计算表达式2.
表达式1 || 表达式2:当表达式1为真时,整个式子肯定为真,编译器将不会计算表达式2.
分析:当程序执行带if语句中,先执行++a,此时a的值为1,不能判断1&&(++b)这个表达式的值,所以进行++b,b的值加到1,此时(++a && ++b)这个表达式的值确定为真,故不进行后面的操作,c的值不发生变化,之后进行if语句中花括号之中的内容,a,b,c的值依次加1,故a的值为2,b的值为2,c的值为1.
2、
int main()
{
int a = 10;
a = !!a;
printf("%d",a); //a的值为1
}
3、非0为真,0为假
4、位运算:一个整数为4字节
结果:
分析:由于一个整数包含四个字节,将十六进制的76左移8位后,它将进入左移到下一个8位中,此时它再和12进行按位或,最右边的8位由全是0变为12的二进制。故结果为7812.
分析:char的范围为-127至128,197超出了它的范围,故a存储的是197的补码形式,为-59(快捷方法:197+59=256),b存储的也是它的补码形式,故为-1,c在char的存储范围内,故能直接存储。
unsigned char的范围为0~256,故e,f能直接存储,但-1超出范围,存储的是补码255.
5、类型转换:默认转换窄变宽
6、前缀++:操作数的值被增加,而表达式的值就是操作数增加后的值。
后缀++:操作数的值被增加,而表达式的值就是操作数增加前的值。
分析:多数编译器printf参数都采用从右往左压栈,所以先计算后面的p[i++],操作数i的值被增加到2,p[2]的值即为3,此时再计算第一个p[i++]的值,i从2通过自加后面为3,p[3]的值即为4.
7、switch:从哪儿进,从哪出
(1)、从哪进:表达式的值与case后的值相同则进入,case顺序不影响结果
(2)、从哪出:遇到break或整个switch结束(break以前是为了灵活,现在是累赘)
(3)case与if语句的不同:
If语句中若判断为真则只执行这个判断后的语句,执行完就跳出if语句,不会执行其他if语句;
而switch语句不会在执行判断为真后的语句之后跳出循环,而是继续执行后面所有case语句。
在每一case语句之后增加break语句,使每一次执行之后均可跳出switch语句,从而避免输出不应有的结果。
8、数组和指针:
(1)数组
数组名arr表示整个数组:
1.在定义数组的同一个函数中,求sizeof(arr),
2.在定义数组的同一个函数中,&arr+1
数组注意事项:
1.越界
2.数组作为参数传递,还需要长度
字符数组
1.以'\0'结尾
(2)指针
指针大小:win32,x86,32位平台为4字节;x64,64位平台为8字节
指针和数组的不同
1.大小不同
2.指针可以++,数组名不能动
3.访问方式不同
在int arr[10]; p = arr;条件下,p[i] == *(p+i); p[-1] == *(p-1)*(arr+i) == arr[i];