C/C++笔记

1. long类型是32位整数,范围是-0x80000000~0x7fffffff;long long是64位整数,范围是-0x8000000000000000~0x7fffffffffffffff

 

VC6.0的64位整数分别叫做__int64与unsigned __int64,其范围分别是[-2^63, 2^63)与[0,2^64),即-9223372036854775808~9223372036854775807与0~18446744073709551615(约1800亿亿)。对64位整数的运算与32位整数基本相同,都支持四则运算与位运算等。当进行64位与32位的混合运算时,32位整数会被隐式转换成64位整数。但是,VC的输入输出与__int64的兼容就不是很好了,如果你写下这样一段代码:

1  __int64 a;
2 cin >> a;
3 cout << a;


那么,在第2行会收到“error C2679: binary '>>' : no operator defined which takes a right-hand operand of type '__int64' (or there is no acceptable conversion)”的错误;在第3行会收到“error C2593: 'operator <<' is ambiguous”的错误。那是不是就不能进行输入输出呢?当然不是,你可以使用C的写法:

scanf("%I64d",&a);
printf(
"%I64d",a);

就可以正确输入输出了。当使用unsigned __int64时,把"I64d"改为"I64u"就可以了。
OJ通常使用g++编译器。其64位扩展方式与VC有所不同,它们分别叫做long long 与 unsigned long long。处理规模与除输入输出外的使用方法同上。对于输入输出,它的扩展比VC好。既可以使用

1long long a;
2cin>>a;
3cout<<a;

也可以使用

scanf("%lld",&a);
printf(
"%lld",a);


使用无符号数时,将"%lld"改成"%llu"即可。

最后我补充一点:作为一个特例,如果你使用的是Dev-C++的g++编译器,它使用的是"%I64d"而非"%lld"。


2. 如果字符串太长,需要书写到多行时,可在每行末尾加反斜线表示本行未完。

 

string str="This string \
is long!"


注意下一行顶格书写,否则会有一堆空格。


3.

幻数——上下文里出现的字面常量。

幻数带来的主要问题是它们没有(抽象)语义。当我们阅读和维护带有幻数的代码时,不得不去一个个地搞清楚每个光秃秃的量到底代表的是什么意思。没错,这样也能勉强度日,但带来的是不必要的精力浪费以及准确性的丧失。

复制代码
 1 //这里的一些10分别代表什么意思?? 2 class Portfolio
 3 {
 4     //... 5     Contact *contracts_[10];
 6     char id_[10];
 7 };
 8 
 9 ......
10 
11 for (int i = 0; i < 10; ++i)
12 ...
复制代码

幻数的另一个不那么显而易见的坏处就是它会以意想不到的方式降低它所代表的类型的精度。

例如:4000, 它实际类型是平台相关的。

另一个字面常量带来的潜在威胁来源于它们没有地址。

 

给幻数起一个名字。作为一个指导原则,除了0和1之外,程序里出现的任何数大概都可以算作幻数,它们应该有自己的名字。

复制代码
1 class Portfolio
2 {
3     //...4     enum {maxContracts = 10, idLen = 10};
5     Contact *contracts_[maxContracts ];
6     char id_[idLen ];
7 };
复制代码

在其所在作用域有着明确含义的枚举常量,有着不占空间,也没有任何运行期成本的巨大优点。

 

把数定义为常数,不要定义为宏。C语言的传统方式是使用#define行来对付幻数。C语言预处理程序是一个强有力的工具,但是它又有些鲁莽。使用宏进行编程是一种很危险的方式,因为宏会在背地里改变程序的词法结构。我们应该让语言去做正确的工作(C预处理命令本身不是C语言的组成部分)。

    在c/c++里,整数常数可以用枚举语句声明。在C++里,任何类型都可以使用const声明的常数:

1 const int MAXROW = 24, MAXCOL = 80;

在Java里,可以用final声明:

1 static final int MAXROW = 24, MAXCOL = 80;

C语言也有const值,但是他们不能用作数组的界。这样,enum就是C中唯一可用的选择了。



 

 

posted on 2013-07-28 22:01  you Richer  阅读(225)  评论(0编辑  收藏  举报