Chinaunix首页 | 论坛 | 博客
  • 博客访问: 929818
  • 博文数量: 376
  • 博客积分: 154
  • 博客等级: 入伍新兵
  • 技术积分: 1558
  • 用 户 组: 普通用户
  • 注册时间: 2011-10-13 08:42
文章分类

全部博文(376)

文章存档

2014年(11)

2013年(88)

2012年(260)

2011年(17)

分类:

2012-02-15 11:17:29

5 基本概念
5.2 循环

1

int main()

{

       int a, x;

       for(a=0,x=0; a<=1 && !x++; a++)

       {

              a++;

       }

       cout <

       return 0;

}

2

/**

*以下程序段在vc6.0下调试未通过,在vs2008下通过。

*/

#include

using namespace std;

 

int main()

{

         int a, x;

         for(a=0,x=0; a<=1 && !x++; )

         {

                   a++;

         }

         cout <

         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++)

5.4 类型转换

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 <    //0013ff7c

         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. 你可以使用一个精度修饰符,它可以根据使用的格式代码而有不同的含义.

  • %e, %E %f,精度修饰符让你指定想要的小数位数. 例如,

·         %12.6f将会至少显示12位数字,并带有6位小数的浮点数.

  • %g %G, 精度修饰符决定显示的有效数的位数最大值.
  • %s,精度修饰符简单的表示一个字符串的最大长度, 以补充句点前的最小字段长度.

·         所有的printf()的输出都是右对齐,除非你在%符号后放置了负号. 例如,

·             %-12.4f将会显示12位字符,4位小数位的浮点数并且左对齐.

·          你可以修改带字母lh%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,

只要出现了floatdouble,则另一个操作数会被提升为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位操作系统中,longint都用一个字长表示,所以不满足条件),则将unsigned int转换为long,否则两个操作数都被转换成unsigned long.

5.5 与或非

1)用一个表达式判断一个数x是否是2N1,2,3…)次方.

Notes

2,4,8,16…的二进制表示为10,100,100010000…x1后与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

5.6 a/b交换

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 的缺点是当ab很大时有可能使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转换为无符型再移位。

5.7 c/c++的关系

1extern “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”.

阅读(819) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~