c语言深度剖析之学习笔记(二)------------符号
2014-05-06 23:32
495 查看
2.1 注释符号
2.1.1
(1)int/*....*/i;
(2)char *s ="abcdefg //hijklmn";
(3)//IS if a\
valid comment?
(4)int/*..*/t i; //不对
说明:不是简单的剔除,而是用空格代替原来的注释
2.1.2 y=x/*p--------------错误
可以修改为:
y=x/ *p
y=x/(*p)
2.2 接续符 和 转义符
2.3 单引号 和双引号
2.4 逻辑运算符----------注意短路规则
int i=0;
int j=0;
if( (++i>0) || (++j >0))
{
printf("%d\n",i);
printf("%d\n",j);
}
输出:
i=1, j =0;
2.5 位运算符
& 按位与
| 按位或
^ 按位异或
~ 取反
<< 左移
>> 右移
说明:按位异或可以实现不用第三个变量是实现交换两个变量的值: (面试题一般会出这种变态的问题)
int a=3;
int b=6;
a ^=b;
b ^=a;
a ^=b;
printf("%d\n",a);
printf("%d\n",b);
2.5.1 位运算符不能用于基本类型是:有符号的操作数上。
2.5.2 “+”优先级比“<<”优先级高
inta =0x01 <<2+3;
printf("%d\n",a);
左移或者右移的位数<=数据的长度;
如: 0x01 << 2+30;
0x01<< 2-3;
2.6 花括号
2.7 ++,--操作符
(1)
int i = 3;
(++i) + (++i) + (++i);
printf("%d\n",i); //测试结果为:6
(2)
int i = 3;
printf("%d\n",(++i) + (++i) +(++i)); //测试为:16
(3)
int i =0;
printf("%d\n",(i++,i++,i++)); //测试结果为:2
(4)
int i =0;
int k = (i++) + (i++) + (i++);
printf("%d\n",k); //k =3
问题:
int i =0;
for( i =0 ,printf("First =%d\n",i);
printf("Second =%d\n",i),i<3;
i++,printf("Third = %d\n",i))
{
printf("Fourth = %d",i);
}
打印:
First = 0
Second = 0
Fourth = 0Third =1
Second = 1
Fourth = 1Third =2
Second = 2
Fourth = 2Third =3
Second = 3
2.7.1 ++i+++i+++I 似乎这是有错误的
int a = 3;
int b = 2;
int k = a+++b;
2.8 2/(-2)的问题
printf("%d\n",(-2)/2); //-1
printf("%d\n",(-2)%2); //0
printf("%d\n",2/(-2)); // -1
printf("%d\n",2%(-2)); //0
大多数编译器满足:
假设: a / b= q……r
(1)b*q +r == a
(2)如果改变a的正负号,希望q的符号也随之改变,但是q的绝对值不会改变。
2.9 符号的优先级
容易出错的优先级问题:(5颗星)
(1).的优先级高于*
*p.f //对p去偏移,作为指针,解引用误认为:(*p).f
(2)[]的优先级高于*
int *p[] //指向int数组的指针
误认为:int (*p)[]
(3)()高于* int *fun()
(4)=
和!=
高于位操作(val & mask
!=0)
实际:val&
(mask
!=0)
误操作
(val& mask
)!=0
(5)算术运算符高于移位运算符 msb<<4+lat;
(6)逗号运算符优先级最低
2.1.1
(1)int/*....*/i;
(2)char *s ="abcdefg //hijklmn";
(3)//IS if a\
valid comment?
(4)int/*..*/t i; //不对
说明:不是简单的剔除,而是用空格代替原来的注释
2.1.2 y=x/*p--------------错误
可以修改为:
y=x/ *p
y=x/(*p)
2.2 接续符 和 转义符
2.3 单引号 和双引号
2.4 逻辑运算符----------注意短路规则
int i=0;
int j=0;
if( (++i>0) || (++j >0))
{
printf("%d\n",i);
printf("%d\n",j);
}
输出:
i=1, j =0;
2.5 位运算符
& 按位与
| 按位或
^ 按位异或
~ 取反
<< 左移
>> 右移
说明:按位异或可以实现不用第三个变量是实现交换两个变量的值: (面试题一般会出这种变态的问题)
int a=3;
int b=6;
a ^=b;
b ^=a;
a ^=b;
printf("%d\n",a);
printf("%d\n",b);
2.5.1 位运算符不能用于基本类型是:有符号的操作数上。
2.5.2 “+”优先级比“<<”优先级高
inta =0x01 <<2+3;
printf("%d\n",a);
左移或者右移的位数<=数据的长度;
如: 0x01 << 2+30;
0x01<< 2-3;
2.6 花括号
2.7 ++,--操作符
(1)
int i = 3;
(++i) + (++i) + (++i);
printf("%d\n",i); //测试结果为:6
(2)
int i = 3;
printf("%d\n",(++i) + (++i) +(++i)); //测试为:16
(3)
int i =0;
printf("%d\n",(i++,i++,i++)); //测试结果为:2
(4)
int i =0;
int k = (i++) + (i++) + (i++);
printf("%d\n",k); //k =3
问题:
int i =0;
for( i =0 ,printf("First =%d\n",i);
printf("Second =%d\n",i),i<3;
i++,printf("Third = %d\n",i))
{
printf("Fourth = %d",i);
}
打印:
First = 0
Second = 0
Fourth = 0Third =1
Second = 1
Fourth = 1Third =2
Second = 2
Fourth = 2Third =3
Second = 3
2.7.1 ++i+++i+++I 似乎这是有错误的
int a = 3;
int b = 2;
int k = a+++b;
2.8 2/(-2)的问题
printf("%d\n",(-2)/2); //-1
printf("%d\n",(-2)%2); //0
printf("%d\n",2/(-2)); // -1
printf("%d\n",2%(-2)); //0
大多数编译器满足:
假设: a / b= q……r
(1)b*q +r == a
(2)如果改变a的正负号,希望q的符号也随之改变,但是q的绝对值不会改变。
2.9 符号的优先级
容易出错的优先级问题:(5颗星)
(1).的优先级高于*
*p.f //对p去偏移,作为指针,解引用误认为:(*p).f
(2)[]的优先级高于*
int *p[] //指向int数组的指针
误认为:int (*p)[]
(3)()高于* int *fun()
(4)=
和!=
高于位操作(val & mask
!=0)
实际:val&
(mask
!=0)
误操作
(val& mask
)!=0
(5)算术运算符高于移位运算符 msb<<4+lat;
(6)逗号运算符优先级最低
相关文章推荐
- 《C语言深度剖析》学习笔记----C语言中的符号
- C语言深度剖析学习笔记-符号
- <<C语言深度剖析>>学习笔记之一:C语言中32个关键字
- C语言深度剖析学习笔记
- C语言深度剖析学习笔记-预处理
- C语言深度剖析学习笔记-指针、数组、内存、函数
- [学习笔记]C语言深度剖析
- <<C语言深度剖析>>学习笔记之三:符号
- <<C语言深度剖析>>学习笔记之五:指针与数组
- Boost学习笔记之六 深度剖析pool
- 5.读c语言深度剖析 -- 符号 注释符号
- c语言深度剖析笔记5
- c语言学习笔记(6)注释符号,接续符号和转义符号的用法
- C语言深度剖析——个人笔记
- C语言深度剖析之typedef学习
- Mohican_11/21 C语言深度剖析 - 符号
- C语言深度剖析笔记(1)
- 1、C语言深度学习笔记--资料汇总
- java事务学习笔记(九)--深度剖析JTA原理与实现
- C语言学习笔记 (005) - 二维数组作为函数参数传递剖析