运算符:
赋值运算符优先级最低
= += -= *= /= %=
int a;
a = 100 ;
a = 100+a;(从右向左运算)
a=200;
unsigned char uc = -1 ;
-1在内存中是补码 实际上uc = 0xff 也就是255
int a; //比如 2
scanf(“%d”, &a);
printf(“ result = %d \n”, a+=a-=a*=a );
C语言中规定:在同一个表达式或者语句中
如果对同一个变量进行了多次赋值, 结果是没有定义的
结果undefined
算术运算符
/ % + - *
闰年的判断 year
能够被4整除但是不能被100整除 或者 能够被400整除 的年份就是闰年
(year%4 == 0 && year%100 != 0) || (year%400 == 0)
注;闰年的2月是29天
逻辑运算符
逻辑真 条件成立,非0 就为真
逻辑假 条件不成立, 0为假
!(条件)
条件为真, 整个表达式为假
条件为假(0), 整个表达式为真 !0
&& ( 条件表达式1 ) &&(条件表达式2)
if ( i > 0 && i < 100)
// 如果i 等于 -10 , 仅仅判断i>0条件为假, i<100这个条件是不判断的
条件表达式1 的优先级是比 条件表达式2要高的,
只有1成立才判断2
|| ( 条件表达式1 ) || (条件表达式2)
if ( i == 0 || i == 100)
// 如果i 等于0 ,不会执行条件2的判断
条件表达式1 不成立才判断条件表达式2
位运算符
寄存器操作
~ 位反 把内存中的每个比特都取反
& 位与
a: 判断一个char类型数据a的第3位是否为1 , 不需要赋值
如a = 0b1010 1010
a & 0x08 == 0 表示a的第3位为0
a & 0x08 != 0 表示a的第3位为1
b: 只令char类型数据a的第4位为0
a = 0b0101 1101
0b1110 1111
a& = 0xef ==== a & =(~ (0x01 <<4) )
0b0000 0001
0b0001 0000 取反 0b1110 1111 也就是0xef
| 位或
令char类型数据a的第4位为1
a = 0b0100 1101
0b0001 0000 |
---|
0b0101 1101
a |= 0x10 ======= a|= (0x01<<4)
<< 左移
右移
左移和右移在不越界,非负数操作时候相当于是变量值乘2和除2 ;
但是遇到了负数则不成立:左移会移走符号位, 右移高位补1。
^ 异或, 对应同一位的值相同则结果为0, 不同则结果为1
a 0b1001 0110
b 0b0011 1000
–^--------------------
0b1010 1110
使用异或实现两数的交换
a ^= b;
b ^= a;
a ^= b;
条件运算符
= < = > < == !=
判断a 是否大于0 小于10
a > 0 && a < 10
sizeof
得到 变量或者是数据类型所占用的内存空间
sizeof(int ) 4
sizeof(char ) 1
sizeof(short) 2
sizeof(long) 4
sizeof(float) 4
sizeof(double) 8
? : 三目运算符
(条件) ? (条件为真的执行体) : (条件为假的执行体)
a b
max = a > b ? a : b;
a b c 中选最大的
a c b c
max = ( a>b ) ? ( a>c ? a :c ) : ( b>c ? b : c );
控制流
分支跳转 根据条件不同,执行不同的语句
if( 条件 )
{
【tab】条件为真执行
}
else
{
【tab】条件为假时执行
}
switch ( 整型变量或者枚举值 ) 匹配项只能是整数或者字符或者是枚举值
{
case 匹配项1:
执行对应功能
break;
case 匹配项2:
执行对应功能
break;
default:
执行对应功能
break;
}
man ascii:
060 48 30 0
062 50 32 2
101 65 41 A
141 97 61 a
012 10 0A LF ‘\n’ (new line)
练习:
循环从键盘输入一个小写字符%c,要求输出它对应的大写字符%c
如果输入的不是小写字符,则显示出它对应的十六进制的ascii码
‘a’ ‘a’ +25 %x
循环控制
while( 条件 )
{
循环体
}
for( 初始化设置 ; 条件判断 ; 执行完循环体之后的操作)
{
循环体
}
for( i = 0 ; i < 10 ; i++)
{
if (i == 5)
break;
}
结束循环之后: i ==== 5
do
{
循环体
}while(条件); 先执行一次循环体,再根据条件判断是否继续执行
for( ; ; ) ==== while(1)
break : for while 结束整个循环
switch 退出该switch语句
continue :for while 提前结束该次循环
return : 都表示返回到函数的调用处,
对于程序入口函数main 中return 表示返回到系统,也就是程序运行结束
goto 常用于程序异常时候的跳转处理,有可能导致栈混乱
基本数据类型
int 4B
char 1B
short 2B
long 4B
float 4B
double 8B
long long 8B
char a ; 是带符号的 1000 0000 ~ 0111 1111 -128 ~ 127 (-27 ~ 27 -1)
unsigned char a 是不带符号的 0000 0000 ~ 1111 1111 0 ~ 255 (0 ~ 28 -1)
unsigned 表示无符号数
存在内存中的数是补码
正数的原码、反码、补码都是一样的 定义&常量
负数反码是原码除了符号位取反, 补码是反码+1
char a = -1 原码 1000 0001
反码 1111 1110
补码 1111 1111
int a = 0x12345678
LINUX -C
带参数的main
int main(int argc , char ** argv)
int main(int argc , char * argv[ ])
不带参数的main
int main(void)