《C语言入门》
? ? ? ? ? ? ? ??热情篇? — —?热情像一对翅膀,带我飞过山岭。
?
目录
?“武器库”
词法陷阱
1.算术操作符
2.移位操作符
3.位操作符
4.赋值操作符
5.单目操作符
6.关系操作符
7.逻辑操作符
8.三目操作符
9.逗号表达式
10.函数调用和结构成员
?“武器库”
整数的二进制表示:原码、反码、补码。
一个整数可以存放到int 类型中,int类型占4个字节,32个bit位。二进制序列的第一位是符号位,符号位是0表示正数,符号位是1表示负数。
例:
15(正数的原码、反码、补码相同)
原码:00000000?00000000?00000000?00001111
反码:00000000?00000000?00000000?00001111
补码:00000000?00000000?00000000?00001111
?-15
原码:10000000?00000000?00000000?00001111
反码:11111111? ?11111111? ?11111111? ?11110000(原码的符号位不变,其它位按位取反)
补码:11111111? ?11111111? ?11111111? ?11110001(反码+1)
词法陷阱
' = '? 不同于 ‘ == ’:=作为赋值运算,‘==’作为比较
  
‘ & ’ 不同于 ‘ && ’? ? ?‘ | ’? ?不同于? ‘?|| ’
#include <stdio.h>
int main()
{
int a = 5;
int b = 0;
int c = a & b;
int c1 = a && b;
int d = a | b;
int d1 = a || b;
printf(" c = %d\n c1 = %d\n d = %d\n d1 = %d",c,c1,d,d1);
return 0;
}

测试练习:
#include <stdio.h>
int main()
{
int i = 0, a = 0, b = 2, c = 3, d = 4;
i = a++ && ++b && d++;
//i = a++||++b||d++;
//i = ++a || ++b || d++
printf("a = %d\n b = %d\n c = %d\nd = %d\n", a, b, c, d);
return 0;
}
???  
1.算术操作符
+ ? -? ? *? ? /? ? %
加减乘除,伴随着我们整个学习生活。前三个就不多介绍了。
‘/’?:除法在c语言中有着它自己的个性,
如果两个操作数都为整数,执行整数除法,这里要注意如果不能整除的话只保留整数部分。而只要有浮点数执行的就是浮点数除法。
?
?

?
‘%’:取余操作符在c语言中也是经常出现的,% 操作符的两个操作数必须为整数。
测试结果:


测试两个整数?返回的是整除之后的余数:

?
2.移位操作符
移位操作符的操作数只能是整数,而移位操作符移动的就是内存中存储整数的二进制补码。
注意:
不要移动负数位
<<
左移操作符:(整个二进制序列向左移动一位,
左边抛弃、右边补
0
)
?
?
>>
右移操作符:
算数右移动(
右边丢弃 ,左边补原符号位)
?
?逻辑右移动(不常见):(右边抛弃,左边补0)
3.位操作符
位(二进制位)
?“
&”:
按位与,二进制的补码 与,有0是0,两个同时为1才是1。

“
|”:
按(二进制位)位或,有1为1,全0才是0。

?
?“
^”:
按位异或,运算规律,相同为0,相异为1。
?

??“^”:按位异或规律:a^a = 0; b^b = 0; a^a^b = b;b^b^a=a;
?练习:不能创建临时变量(第三个变量),实现两个数的交换。
解法1:
#include <stdio.h>
int main()
{
int a = 3;
int b = 5;
a = a + b;
b = a - b;
a = a - b;
printf("a = %d b = %d",a,b);
return 0;
}

缺点:两个整型相加的时候可能出现?超过一个整型的大小。
解法2:
#include <stdio.h>
int main()
{
int a = 3;
int b = 10;
a = a ^ b;
b = b ^ a;//b^a^b
a = a ^ b;//a^b^b
printf("a = %d b = %d", a, b);
return 0;
}

4.赋值操作符
'=':赋值操作符:
int a = 10;
int b = 5;
itn c= a+b;
复合赋值符 :+=、-=、*=、/=、%=、>>=、<<=、&=、|=、^=
例:sum = sum + i; 等价与 sum += i;
5.单目操作符
! ? ? ? ? ?
逻辑反操作
- ? ? ? ? ?
负值
+ ? ? ? ? ?
正值
& ? ? ? ? ?
取地址
sizeof ? ? ?
操作数的类型长度(以字节为单位)
~ ? ? ? ? ?
对一个数的二进制按位取反
?
前置?++ 和 --,先增加(递减),在使用。
?
后置?
++ 和 -- ,
先使用,再增加(递减)。
*? ? ? ? ??
间接访问操作符
(
解引用操作符
)
(
类型
) ? ? ?
强制类型转换
6.关系操作符
(>)?(<) (>=)? (<=)? (!=)? ?(
==)?? ? ?
7.逻辑操作符
特点:只关注真假(0为假,非0为真)
&& ? ?
逻辑与? ? ?一假则假
?测试:
 
|| ? ? ? ?
逻辑或? ? ?一真则真(有一个条件满足就可以)
8.三目操作符
使用三目操作符找两个数中较大值
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
scanf("%d %d",&a,&b);
int c = (a > b ? a : b);
printf("%d",c);
return 0;
}
9.逗号表达式
逗号表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果。
? 
10.函数调用和结构成员
'( )': 函数调用操作符,接受一个或者多个操作数:第一个操作数是函数名,剩余的操作数就是传递给函数的参数。
访问一个结构的成员:.??结构体.成员名 ,->??结构体指针->成员名
struct room
{
char room[20];
int price;
};
int main()
{
struct room a = {"标间",66};
printf("%s %d\n",a.room,a.price);
struct room *b =&a;
printf("%s %d\n",(*b).room,(*b).price);
printf("%s %d\n",b->room,b->price);
return 0;
}
?
|