c/c++编程小知识1

来源:互联网 发布:云计算大数据就业前景 编辑:程序博客网 时间:2024/06/06 03:48

运算符运算等级如下

其中 1级优先级最高,15级最低,

  1级优先级 左结合

  () 圆括号

  [] 下标运算符

  -> 指向结构体成员运算符

  . 结构体成员运算符

  

2级优先级 右结合

  ! 逻辑非运算符

  ~ 按位取反运算符

  ++ 自增运算符

  -- 自减运算符

  - 负号运算符

  (类型) 类型转换运算符

  * 指针运算符

  & 地址与运算符

  sizeof 长度运算符

  

3级优先级 左结合

  * 乘法运算符

  / 除法运算符

  % 取余运算符

 

 4级优先级 左结合

  + 加法运算符

  - 减法运算符

  

5级优先级 左结合

  << 左移运算符

  >> 右移运算符

  

6级优先级 左结合

  <<=>>=关系运算符

  

7级优先级 左结合

  == 等于运算符

  != 不等于运算符

  

8级优先级 左结合

  & 按位与运算符

  

9级优先级 左结合

  ^ 按位异或运算符

  

10级优先级 左结合

  | 按位或运算符

 

 11级优先级 左结合

  && 逻辑与运算符

 

 12级优先级 左结合

  || 逻辑或运算符

 

 13级优先级 右结合

  ? : 条件运算符

  

14级优先级 右结合

  = += -= *= /= %= &= ^= |= <<= >>= 全为赋值运算符

  

15级优先级 左结合

   逗号运算符



1.ACM一般采用C语言节约空间,要用C++库函数或STL时才用C++;

coutcinprintfscanf最好不要混用。

大数据输入输出时最好不要用cincout,防止超时。

2.有时候int型不够用,可以用long long__int64(两个下划线__)

值类型表示值介于 -2^63 ( -9,223,372,036,854,775,808)2^63-1(+9,223,372,036,854,775,807 )之间的整数。

printf("%I64d",a); //__int64 一般VC编译器使用

printf("%lld",a); //long long 一般g++编译器使用

3.OJ判断是只看输出结果的。

所以大部分题处理一组数据后可以直接输出,就不需要用数组保存每一个Case的数据。

while(case--)

{scanf(...);

......

printf(...);

}

4.纯字符串用puts()输出。

数据大时最好用scanf()printf()减少时间。

先用scanf(),再用gets()会读入回车。所以在中间加一个getchar();

scanf("%c%c",&c1,&c2)会读入空格;建议用%s读取字符串,取第一个字符。

5.

读到文件的结尾,程序自动结束

while( ( scanf( %d,&a) ) != -1 )

while( ( scanf( %d,&a) ) != EOF)

while( ( scanf( %d,&a) ) == 1 )

while( ~( scanf( %d,&a) ) )

读到一个 0 时,程序结束

while( scanf( %d,&a) ,a)

读到多个0时,程序结束

while( scanf( %d%d%d,&a,&b,&c),a+b+c ) //a,b,c非负

while( scanf( %d%d%d,&a,&b,&c),a|b|c )

6.数组定义int a[10]={0};可以对其全部元素赋值为0

数组太大不要这样,防止CE

全局变量,静态变量自动初始化为0

7.有很多数学题是有规律的,直接推公式或用递归、循环。

8.圆周率=acos(-1.0)

自然对数=exp(1.0)

9.如果要乘或除2^n,用位移运算速度快。a>>n;a<<n;

10.定义数组时,数组大小最好比告诉的最大范围大一点。

字符数组大小必须比字符串最大长度大1

处理字符数组时不要忘了在最后加'/0'或者0

11.擅用三目运算符

int max(int a,int b)

{return a>b?a:b;

}

int gcd(int m,int n)

{return n?gcd(n,m%n):m;

}

int abs(int a)

{return a<0?-a:a;

}

12.将乘法转换成加法减少时间

log(a*b)=log(a)+log(b)

将乘法转换成除法防止溢出

a/(b*c)=a/b/c

13.排序要求不高时可以用C++STL模板函数sort(),stable_sort()

int a[n]={...};

sort(a,a+n);

bool cmp(int m,int n)

{return m>n;

}

sort(a,a+n,cmp);

14.有的题数据范围小但是计算量大可以用打表法

先把结果算出来保存在数组里,要用时直接取出来。

15.浮点数比较时最好控制精度

#define eps 1e-6

fabs(a-b)<eps

16.有些字符串与整型的转换函数是非标准的

可以使用sscanf()sprintf()代替

sscanf(s,"%d",&n);//从字符串s中读入整数n

sprintf(s,"%d",n);//n转换为字符串s

17.

define定义数组初始化函数

#define MS(a,b) memset(a,b,sizeof(a))

18.

数据类型取值范围

unsigned int 042 9496 7295 

int -214748364821 4748 3647 

unsigned long 04294967295

long -21474836482147483647

long long的最大值:922 3372 0368 5477 5807

long long的最小值:-9223372036854775808

unsigned long long的最大值:184 4674 4073 7095 5161

__int64的最大值:922 3372 0368 5477 5807

__int64的最小值:-9223372036854775808

unsigned __int64的最大值:1844 6744 0737 0955 1615

19.

如果A上方无界,我们则说

Sup{A}=+

如果A下方无界,则认为

Inf{A}=-∞。

常用Sup表示上确界,用Inf表示下确界。

21.

二进制位移操作。当 x 1 时,1转为二进制还是 1,向左位移变为10,然后与1 进行二进制或运算就是11,二进制11 其实就是十进制的3

1 << 1 等于 00000001 << 1等于 00000010等于十进制 2

2 << 1 等于 00000010 << 1等于 00000100等于十进制 4

3 << 1 等于 00000011 << 1等于 00000110等于十进制 6

4 << 1 等于 00000100 << 1等于 00001000等于十进制 8

也不难理解向左移动多位。如向左移 2 00001110 << 2

00001110

------------

00111000

同样 C 语言中还有还有右移运算符>>,表示按二进制位向右移动。

23.

i&(-i)是什么意思?

返回 i  的二进制数最低位为1的权值

例如

10100最低位的1权值是4

1001010最低位的1权值是2

111最低位的1权值是1

因此

#include<iostream>

using namespace std;

int main()

{

    int i;

    for(i=1; i<=10; i++)

        cout<<(i&(-i))<<endl;

    return 0;

}

的结果就是

1 2 1 4 1 2 1 8 1 2

24.

大数组定义在main函数中不能执行,将其定义为全局变量就可以执行的原因。

答:定义在函数中时,占用的内存来自栈空间,栈空间是在进程创建时初始化的,有固定的大小,一般为几十KB,所以太大的数组会耗光栈空间。

而全局变量在编译的时候编到数据段的,按需分配,自由增长的,可以非常大,32位的系统中可以大到4GB。 

37. scanf("\n%*c%d",&m);

scanf 格式中,如果在%后面、格式字符前面加上一个“*”附加说明符,表示跳过该输入,输入的数据不放入变量中。

而输入的 '\n' 是中和掉输出的\n

也可以换成

getchar();

scanf("%*c%d",&m);

*c 表示忽略一位 也可以改成

scanf("%*1d%d",&m);

 

38.sscanf() - 从一个字符串中读进与指定格式相符的数据。

 

39.%n与其他格式说明符号不同。%n不向printf传递格式化信息,而是令printf把自己到该点已打出的字符总数放到相应变元指向的整形变量中。因此%n对于的变元必须是整形指针。

printf调用返回之后,%n对于变元指向的变量中将包含有一个整数值,表示出现%n时已经由该次printf调用输出的字符数。

printf("this%n is a test\n",&count);//调用后count4,this长度为4

sscanf(str+start,"%d%n",&d,&n);     start+=n;             n=读进数字的长度  

 

 

40.DESC表示按倒序排序(即:从大到小排序)

ACS  表示按正序排序(即:从小到大排序)

 

41.C语言中typedef是用来进行类型定义,和define相对应

define是把一个自己起的名字的常量定义为代替它的另一个常量来用

typedef是把一个自己起的名字的类型用已经有的类型代替使用,如:

typedef int LL;

之后如果有LL i ;系统则理解为int i;

又如:

typedef long long LL;

之后如果有

Priority_queue<LL,vector<LL>,greater<LL> >a;

系统则理解为

Priority_queue<long long,vector<long long>,greater<long long> >a;

 

43.在判断两个浮点数大小时,一定要在一边先减去0.000001,如a<b,一定写成a-0.000001<b才行!

 

44.For(int i=0;i<8;i++);

For(int j=i;j<8;j++);  循环语句加;代表循环一旦确定了i,就只能往下走,即在i0j循环结束后就直接结束了,不会从下面的j循环结束后回来再改变i。一般情况下会有更大范围的while回来改变i,再使用这两个for循环

 

45. 注释方法

第一种:

我是代码1

// 我是注释1

我是代码2

 

第二种:

我是代码1

/* 我是注释1

我是注释2

我是注释3

*/

我是代码2

 

第三种:

我是代码1

#if 0

我是注释1

我是注释2

我是注释3

#endif

我是代码2

 

组合1

#if 0

/*

我是注释

*/

#endif

 

组合2

/*

//我是注释

*/

 

46.

最精巧的无穷大常量取值是0x3f3f3f3f.

 

47.

二维数组初始化为0可以这样写

Int a[8][8]={{0}};两个大括号即可