分类:
2012-02-15 11:17:29
原文地址:程序员面试宝典 第5章 基本概念 作者:developinglife
(1)
int main()
{
int a, x;
for(a=0,x=0; a<=1 && !x++; a++)
{
a++;
}
return 0;
}
(2)
/**
*以下程序段在vc6.0下调试未通过,在vs2008下通过。
*/
#include
using namespace std;
int main()
{
int a, x;
for(a=0,x=0; a<=1 && !x++; )
{
a++;
}
return 0;
}
/**
*output: 8 8
*tips: printf 计算参数时总是从右到左压栈的,从右向左计算即先计算*(ptr++)
*/
#include
void main()
{
int arr[] = {6, 7, 8, 9, 10};
int *ptr = arr;
*(ptr++) = 123;
printf("%d, %d", *ptr, *(++ptr));
}
Notes:
printf 计算参数时总是从右到左压栈的,从右向左计算即先计算*(ptr++)
(1)
#include
using namespace std;
int main()
{
unsigned char a = 0xA5;
unsigned char b = ~a>>4;
printf("b = %d",b); //245
return 0;
}
Notes:
a.隐式类型转换:
char->short->int->long int->|
float-> | double->long double
usigned char->u short->u int->u long-> |
b.运算符优先级: 单目-算数-比较-逻辑-条件
(2)
#include
using namespace std;
int main()
{
unsigned char a = 0xA5;
unsigned char b = a*2;
printf("b = %d",b); //74
return 0;
}
Notes: 左移一位
(3)
#include
using namespace std;
int main()
{
float a = 1.0f;
cout<< int(a)<
cout<< &a <
cout<< (int&)a<
cout<< boolalpha<<((int)a == (int&)a) <
float b = 0.0f;
cout<< (int)b<
cout<< &b<
cout<< (int&)b<
cout<< boolalpha <<((int)b == (int&)b)<
return 0;
}
Notes:
浮点数的内存表示,强制类型转换,(int&)
(4)
#include
int main()
{
unsigned int a = 0xfffffff7;
unsigned char i = (unsigned char)a;
char* b = (char*)&a;
printf("%08x, %08x",i,*b); //000000f7, fffffff7
}
Notes:
a.将宽类型赋给窄类型时发生字符阶段,只截取后面的有效长度;
b.&a的类型为unsigned int *,强制将其转换成char*类型。相当于:
unsigned int * p = &a; char* b = (char*)p;则:
p+1 = x+1*sizeof(int) = x+4;
b+1 = x+1*sizeof(char) = x+1;
c. printf函数参数:
Code |
格式 |
%c |
字符 |
%d |
带符号整数 |
%i |
带符号整数 |
%e |
科学计数法, 使用小写"e" |
%E |
科学计数法, 使用大写"E" |
%f |
浮点数 |
%g |
使用%e或%f中较短的一个 |
%G |
使用%E或%f中较短的一个 |
%o |
八进制 |
%s |
一串字符 |
%u |
无符号整数 |
%x |
无符号十六进制数, 用小写字母 |
%X |
无符号十六进制数, 用大写字母 |
%p |
一个指针 |
%n |
参数应该是一个指向一个整数的指针 |
%% |
一个'%'符号 |
一个位于一个%和格式化命令间的整数担当着一个最小字段宽度说明符,并且加上足够多的空格或0使输出足够长. 如果你想填充0,在最小字段宽度说明符前放置0. 你可以使用一个精度修饰符,它可以根据使用的格式代码而有不同的含义.
· %12.6f将会至少显示12位数字,并带有6位小数的浮点数.
· 所有的printf()的输出都是右对齐的,除非你在%符号后放置了负号. 例如,
· %-12.4f将会显示12位字符,4位小数位的浮点数并且左对齐.
· 你可以修改带字母l和h%d, %i, %o, %u和 %x 等类型说明符指定长型和短型数据类型 (例如 %hd 表示一个短整数). %e, %f和 %g 类型说明符,可以在它们前面放置l指出跟随的是一个double. %g, %f和 %e 类型说明符可以置于字符'#'前保证出现小数点, 即使没有小数位. 带%x类型说明符的'#'字符的使用, 表示显示十六进制数时应该带'0x'前缀. 带%o类型说明符的'#'字符的使用, 表示显示八进制数时应该带一个'0'前缀.
· 你可以在输出字符串中包含 .
· printf()的返回值是打印的字符数,如果发生错误则返回一个负值.
(5)隐式类型转换发生的情况:
a. 算术表达式b. 赋值表达式 c.参数传递:将实参转换为形参类型d.函数实际返回值的类型转换为定义的返回值类型。
(6)隐式类型转换原则:
隐式类型转换:
char->short->int->long int->|
float-> | double->long double
usigned char->u short->u int->u long-> |
a. 窄类型总是被提升为款类型
b. 表达式中有long double,则另一个操作数会被提升为long double, 没有long double,
只要出现了float或double,则另一个操作数会被提升为double
c.如果两个操作数都不是浮点型,则必为某种整值类型,则编译器会将小于int的整值类型施加整值提升的过程:
char/unsigned char/short int 会被提升为int。
如果机器上的类型空间足够表示所有的unsigned short int类型的值(这通常发生在short 用半个字,int用一个字的情况下),则unsigned short int 会被提升为int,否则会被提升为unsigned int.
wchar_t和枚举类型会被提升为能够表示其底层类型所有值的最小整数类型。
如果两个数中有unsigned long 另一个操作数被提升为unsigned long.
如果两个都不是unsigned long ,一个是long,则另一个被提升为long.
若果一个是long,一个是unsigned int ,那么只要机器的long类型足以存放unsigned int(一般32位操作系统中,long和int都用一个字长表示,所以不满足条件),则将unsigned int转换为long,否则两个操作数都被转换成unsigned long.
(1)用一个表达式判断一个数x是否是2的N(1,2,3…)次方.
Notes:
2,4,8,16…的二进制表示为10,100,1000,10000…故x减1后与x做与运算得0
Answer:(x!=1) && !(x&(x-1))
(2)
#include
int main()
{
int count = 0;
int m = 9999;
while(m)
{
count++;
m = m&(m-1);
}
printf("%d",count);
return 0;
}
Notes:
输出m的二进制表示中1的个数,9999=1024-16-8-1
(1)不用任何中间变量将a/b的值进行交换:
Notes:
A1: a=a+b; b= a-b; a= a-b;
A2:a=a^b; b= a^b; a= a^b;
解法A1 的缺点是当a、b很大时有可能使a+b 越界,不如解法A2.
(2)不用if、?:、switch 等判断语句,判断a/b那个数较大:
Notes:
A1: int max = ((a+b)+abs(a-b))/2;
A2:
int c = a-b;
c= unsigned(c)>>(sizeof(int)*8-1);
char *str[2]={“a大”,”b大”};
cout<< str[c];
解法A2根据相减结果的符号位判断两数大小。注意将c转换为无符型再移位。
(1)extern “c”的作用:
在c++程序中调用被c编译器编译过的函数时,解决名字匹配的问题。
c不支持函数重载,c++支持,函数在c编译器和c++编译器中被编译后的函数名不同,eg:
void func(int x, int y)被c编译器编译后的名字为:_func,而被c++编译器编译后的名字为:
_func_int_int,为了解决名字匹配的问题,在c++程序中调用c编译器编译后的c函数时加上extern “c”.