1、#include <stdio.h> int main(void) { int b=3; int arr[]={6,7,8,9,10}; int *ptr = arr; *(ptr++)+=123; printf("%d,%d/n",*ptr,*(++ptr)); return 0; }
结果为:8 8
C中printf计算参数时是从右到左压栈的。
*(ptr++)+=123应为*ptr=*ptr+123;ptr++;此时ptr指向第二个元素。(P36)
2、 //a is a variable //A: if('A'==a) a++; //B: if(a=='A') a++;
A写法好于B写法,当把"=="误写为"="时,编译器不允许对常量赋值,可以检查到错误。形成良好的编程习惯。(P36)
3、#include <iostream> using namespace std; int main(void) { unsigned char a = 0xA5; unsigned char b = ~a>>4; //cout<<b; printf("b=%d/n",b); return 0; }
unsigned char b=~a>>4;
编译器会先把a和4值转换为int型(整数提升)在进行计算,再把计算结果转换为unsigned char赋值给b。
"~"的优先级高于">>"。
C++符号优先级 http://www.cppblog.com/aqazero/archive/2010/10/29/8284.html 。(P37)
4、#include <iostream> using namespace std; int main(void) { float a = 1.0f; cout<<(int)a<<endl; cout<<&a<<endl; cout<<(int &)a<<endl; cout<<boolalpha<<((int)a == (int &)a)<<endl; float b = 0.0f; cout <<(int)b<<endl; cout<<&b<<endl; cout<<(int &)b<<endl; cout<<boolalpha<<((int)b == (int &)b)<<endl; return 0; }
(int &)a : 将a的引用强制转化为整型,意思是a所在的内存,本来定义的时候是float类型,并初始为1.0f,但现在我要按int类型解释这段内存(也就是说a所在的内存地址中的数据本来是按float型存储表示的,
你非要按int型来解释不可)。将a存储单元开始的内容解释为一个int引用。
更详细的解释以及float在C++中的存储:
http://hi.baidu.com/yu_xiyan/blog/item/735037541f1561113b29358e.html 。(P38)
5、#include <iostream> using namespace std; int main(void) { unsigned int a = 0xFFFFFFF7; unsigned char i = (unsigned char)a; char *b = (char *)&a; printf("%08x,%08x",i,*b); return 0; }
char *b = (char *)&a;
等价于
unsigned int *p = &a;
char *b = (char*)p;
将unsigned int型指针强制转换成一个cher *型的指针。这里是char类型的指针转换,不是char类型的转换。
这样转换后,假设a的地址是x:
p+1 = x+1*sizeof(int) = x+1*4;
b+1 = x+1*sizeof(char) = x+1*1;
影响的是指针的寻址。
6、不用"if"/"?:"/"switch"/或其他判断语句,找出两数中比较大的
第一种方法:
int max = (a+b+abs(a-b))/2;
第二种方法:
int c = a-b;
c = unsigned(C)>>(sizeof(int)*8-1);
char *str[2]={"a大","b大"}; (P42)
7、不用中间变量交换a、b
方法一:
a = a+b; b = a-b; a = a-b;//这种方法可能造成溢出!!!
方法二:
a = a^b; b = a^b; a = a^b; (P42)
8、在C++程序中调用被C编译器编译后的函数,为什么要加extern "C"?
C++语言支持函数重载,C语言不支持函数重载。函数被C++编译后在库中的名字与C语言的不同。
假设某个函数的原型为:void foo(int x,int y)。该i函数被C编译器编译后在库中的名字为_foo,
而C++编译器则会产生像_foo_int_int之类的名字。
C++提供了C链接交换指定符号extern "C"解决名字匹配问题。(P43)