C语言基础学习(二)

运算符

赋值运算
= += -= *= %= /= ++ –
&= |= ^= ~= <<= >>=

Int a = 100;
a += 1; ==> a(新101) = a( 旧100) + 1 ;
a=100;
b = a ++;先用a的旧值,再把a的值自加1
b=100;
a = 101;

a = 100;
b = ++a ; 把a的值自加1, 再使用a的新值给b赋值
A= 101;
B = 101;

算术运算

%(取余) / + - *

条件运算符
< > >= <= == !=
如果要表达a大于10
a > 10 a如果大于10 则条件成立, (a>10)表达式为真, 非0 -1 0.1
a如果大于10 则条件不成立, (a>10)表达式为假, 0

逻辑运算
&& 逻辑与 而且 只要遇到不成立就停止
条件1 && 条件2
1 :如果条件1成立, 才判断条件2是否成立
 2:如果条件1 不成立, 条件2不会执行
3: 只有两个条件都同时成立, 整个表达式(条件1 && 条件2)才为真

A 大于4 而且小于10
a>4 && a<10 两个条件都成立, 整个表达式才为真

|| 逻辑或 或者 只要遇到成立就停止
条件1 || 条件2
1 :如果条件1成立, 则不判断条件2是否成立,条件2不会执行
 2: 如果条件1 不成立, 条件2会执行,才判断条件2是否成立
3: 只要有一个条件都成立, 整个表达式(条件1 || 条件2)就为真

! 逻辑非
!(条件)
条件为真 , 表达式!(条件) 为假
条件为假 , 表达式!(条件) 为真

位运算 (二进制)
& 位与
把2个二进制数相与, 对应位都为1才为1, 只要有一方为0 ,就是0

a = 100; 0b0110 0100
b = 32; 0b0010 0000

a & b == 0010 0000
a & b , b如果只是某位为1, 常用来判断a某位上的数值是否为1
a&b > 0 则表示a 该位值为1
a&b == 0 则表示a 该位值为0

a = 0x6a; 0b0110 1010
b = 0xf7; 0b1111 0111
a = a&b; 0b0110 0010 可以令变量a的某一位为0

| 位或
把2个二进制数相或, 对应位只要有一个1就是1, 双方为0 ,才是0
常只是对某一位进行设值
a = 0x64; 0b0110 0100
b = 0x01; 0b0000 0001
a|b 0110 0101

~ 位反
a = 0x64 ; 0b0110 0100
~a 0b100 1 1011

^ 异或 实现两个数值的交换

把2个二进制数相异或, 对应位相同为0 , 不同1
a = 0x64; 0b0110 0100
b = 0xa7; 0b1010 0111
a^b 1100 0011

a = 0x64; 0b0110 0100
b = 0xa7; 0b1010 0111

a=a^b; 1100 0011 新a
1010 0111 旧b
b= a^b; 0110 0100 新的b为旧的a值
1100 0011 新a
a=a^b; 1010 0111 新的a为旧的b值

a ^= b;
b ^= a;
a ^= b;

<< >>在不越界的情况下,且对非负数操作的时候,等同于乘除运算,以2为基数
对符号位右移操作的时候, 高位补符号位, 左移操作直接把符号位移走
Int a = 0x64; 0110 0100
A << 1 ==> 1100 1000 相当于 a*21
A >> 2 ==> 0001 1001 相当于 a/22

思考 :
给一个char类型数据用10进制或者是16进制赋值,
要求输出这个数据的二进制表达式 (使用位运算符)

Char a ; %hhd 输入100
输出 “该数为0b01100100”
该数为0b
Unsigned char ref = 0x80;
最高位
If( a & ref > 0)
// If( a & 0b1000 0000 > 0)
Printf(“1”);
Else
Printf(“0”);

If( a & (ref>>1) > 0)
// If( a & 0b0100 0000 > 0)
Printf(“1”);
Else
Printf(“0”);

最低位
If( a & (ref>>7) > 0)
//If( a & 0b0000 0001 > 0)
Printf(“1”);
Else
Printf(“0”);

运算符优先级:
从高到低
[ ] ( ) . ->
++ – sizeof +(正号) -(负号)
& !逻辑反 ~ 位反

算术运算符 % * / + -

位运算 << >>

条件运算符 > >= < <= == !=

位运算 & | ^

逻辑 && ||

赋值运算符 = += -= *= %= /= &= |= ^= ~= <<= >>=
, (逗号运算符)

注意: 1:赋值运算符的优先级是最低
2: If (num & (ref >> i) >0 )
实际运行时候是 If ( num & ((ref >> i) >0) )
如果num & ((ref >> i) >0) 的结果不为0, 则条件为真
为0则假
3: sizeof 可以得到变量或者是具体的一个数据类型占用内存空间的大小
使用sizeof确定昨天说的所有基本数据类型对应的内存大小是否正确

4: 三目运算符
条件 ? 条件成立对应的执行体 : 条件不成立对应的执行体 ;
Max , a, b 用a和b中比较大的值给max赋值
A)
if ( a> b)
Max = a;
Else
Max = b;
B)
Max = (a>b) ? a : b ;

控制流
分支跳转
1)
If ( 条件)
{
执行体1
}
else
{
执行体2
}

If ( 条件1 )
{
执行体1
}
else if( 条件2 )
{
执行体2
}
Else
{
执行体3
}

2)只是针对整型数、字符、枚举进行判断
Switch case default break

switch ( 变量、枚举值)
{
case NUM1: NUM1只能是整数或者字符(‘a’)或者是枚举值
执行体1
break;
case NUM2:
执行体2
break;
default:
break;
}

练习:已知 2016年1月1日是星期五
要求输入2016年的一个日期, 计算这个日期是第几个星期几, 并打印出来
如2016年7月22日 是今年的第30个星期五
1: 首先得到月份和日期
Scanf(“%d%d”, &Month , &day)

2: 计算2016已经过了多少天 , 就可以知道是第几个星期
A: switch (month)
{
Case 1: total = day ; break;
Case 2: Total = 31+day; Break;
Case 3: Total = 31+29 + day; Break;
Case 4: Total = 31+29+31 + day; Break;

Case 12: Total = 31+29+31 + 30+31+30+31+31+30+31+30+day;Break;
}
B:
Total = 0;
switch (month)
{
Case 12: Total += 30; 11月的天数
。。。。
Case 3: Total += 29; 2月份的天数
Case 2: Total += 31; 1月份的天数
Case 1: total += day ;
break;
}

C: 数组

3; 星期几就需要根据第一天来推算了
如 1月1号 就是第一个星期五
1月10号 已经过了10天, 10/7 =1
10%7 = 3
所以是第2个星期日
Cnt = total / 7 +1; 第几个星期

D = total % 7;
Switch (D)
{
Case 0: 星期四; break;
Case 1: 星期五; break;
Case 2: 星期六; break;
Case 3: 星期日; break;
Case 4: 星期一; break;

}

Goto 程序运行出错 需要马上进行出错处理时候

循环控制
While( )

For ( ; ; )

Do … While();

循环控制
While( 条件) // 如果条件成立则执行循环体
{
循环体
}

循环体中如果出现了continue , 结束本次循环操作, 继续while判断

For循环
For( 初始化 ; 条件判断 ; 执行完循环体之后的操作 )
{
循环体;
}

For( ; ; )
{
}

Do … While();
do
{
循环体;
}while(判断条件) ;
先执行一次循环体,条件满足再继续执行循环体

break 彻底退出整个循环
continue 仅仅提前结束本次循环操作, 再次判断条件,如果符合则继续执行循环体
return 不管你在代码哪个位置看到return 都表示返回到该函数被调用处
main函数中的return 因为是返回到系统,所有会导致程序结束

原创文章 21 获赞 6 访问量 5349

猜你喜欢

转载自blog.csdn.net/weixin_44244812/article/details/105270872