1 , 用按位异或操作可实现不用第3个临时变量交换两个变量的值:
a ^= b; b^ = a; a ^= b; 或 a ^= b ^= a;
注: 只能对int,char..
但并不推荐这样做, 因为这样的代码读起来很费劲.
还有一种方法,用算法方法:
a = a + b; b = a - b; a = a - b;
2, ++ , -- 操作符
这绝对是一对让人头疼的兄弟。先来点简单的:
inti=3;
(++i)+(++i)+(++i);
表达式的值为多少?15吗?16吗?18吗?其实对于这种情况,C语言标准并没有作出
规定。有点编译器计算出来为 18,因为 i经过 3次自加后变为 6,然后3 个6 相加得18;
而有的编译器计算出来为 16(比如 VisualC++6.0),先计算前两个i 的和,这时候i 自加两
次,2 个 i的和为 10,然后再加上第三次自加的i 得 16。其实这些没有必要辩论,用到哪个
编译器写句代码测试就行了。但不会计算出 15的结果来的。
++、--作为前缀,我们知道是先自加或自减,然后再做别的运算;但是作为后缀时
底什么时候自加、自减?这是很多初学者迷糊的地方。假设 i=0,看例子:
A),j=(i++,i++,i++);
B),for(i=0;i<10;i++)
{
//code
}
C),k= (i++)+ (i++)+ (i++);
可以试着计算他们的结果。 例子为逗号表达式,i在遇到每个逗号后,认为本计算单位已经结束,i 这时候自加。
关于逗号表达式与“++”或“--
”的连用,还有一个比较好的例子:
int x;
int i=3;
x= (++i,i++,i+10);
问 x的值为多少?i的值为多少?
按照上面的讲解,可以很清楚的知道,逗号表达式中,i 在遇到每个逗号后,认为本计算
位已经结束,i 这时候自加。所以,本例子计算完后,i的值为5,x的值为 15。
例子 i与 10进行比较之后,认为本计算单位已经结束,i这时候自加。
例子 i遇到分号才认为本计算单位已经结束,i 这时候自加。
就是说后缀运算 C 语言里的计算单位大体分
以上 3 类。
留一个问题:
for(i=0,printf(“First=%d”,i);
i<10,printf(“Second=%d”,i);
i++,printf(“Third=%d”,i))
{
printf(“Fourth=%d”,i);
}
打印出什么结果?
3、
我有一个 char* 型指针正巧指向一些 int 型变量, 我想跳过它们
为什么如下的代码((int*)p)++; 不行?
在 C 语言中, 类型转换意味着 “把这些二进制位看作另一种类型, 并作相应的对待”; 这是一个转换操作符, 根据定义它只能生成一个右值 (rvalue) 而右值既不能赋值, 也不能用 ++ 自增 (如果编译器支持这样的扩展, 那要么是一个错误, 要么是有意作出的非标准扩展 ) 要达到你的目的可以用:
p = (char *)((int *)p + 1);
或者,因为p是 char* 型, 直接用
p += sizeof(int);
但是, 在可能的情况下, 你还是应该首先选择适当的指针类型, 而不是一味地试图李代桃僵