NCRE 2 C整合

整合 (Detail)

  1. 逗号运算符,优先级别最低(为15),它将两个及其以上的式子联接起来,从左往右逐个计算表达式,整个表达式的值为最后一个表达式的值。如:(3+5,6+8)称为逗号表达式,其求解过程先表达式1,后表达式2,整个表达式值是表达式2的值。

    如:(3+5,6+8)的值是14,a=(a=35,a4)的值是60,而(a=35,a4)的值是60, a的值在逗号表达式里一直是15,最后被逗号表达式赋值为60,a的值最终为60。

    即 在逗号表达式里运算时按从左到右,但最终结果为最后一个表达式的结果

    例:(a = 3,b = 5,b+ = a,c = b* 5) answer:40

  2. if 条件句

    if(条件1)

    如果条件1为真,执行这里;(条件为真才执行)

    else if(条件2)

    否则,当条件2为真执行这里。(当条件1不为真,条件2为真执行这里),若条件2也不为真则不执行后续操作。

  3. 对数组的定义

​ ‘’’int N=10; int a[N];’’’ 此写法错误,即使int定义了整形变量N,但N仍为可变变量,数组不可使用变量进行定义。

​ ‘’’#define N 10 int a[N];’’’此写法正确,define函数定义了一个常量,其不同在于设定之后常量的值无法更改,所以可用与数组的定义,且其作用于不影响对常量的访问,常量值只能是字符串或数字。

  1. switch语句

    switch(n)

    {

    case1:case3:n+=1;k–;break;

    default:n=0;k–;

    case 2:case4:n+=2;k–;break;

​ }. 此段语句中,若初始值int n=5;据switch语句中应执行default操作,执行后的结果n=0,看似没问题的一段执行顺序实则暗藏玄机。

在switch语句体中,必定少不了break的支撑,无论是单条case语句还是default语句,若后面没有break;则不会跳出switch语句体,反而会继续按序向下执行下一条语句。本段代码中则继续执行case 2:case4:n+=2;k—;break;直到遇到此处的break;程序才会跳出switch语句体。因此结果为2.

  1. static变量

    局部变量

普通局部变量是再熟悉不过的变量了,在任何一个函数内部定义的变量(不加static修饰符)都属于这个范畴。编译器一般不对普通局部变量进行初始化,也就是说它的值在初始时是不确定的,除非对其显式赋值。ps:普通局部变量存储于进程栈空间,使用完毕会立即释放。

静态局部变量使用static修饰符定义,即使在声明时未赋初值,编译器也会把它初始化为0。且静态局部变量存储于进程的全局数据区,即使函数返回,它的值也会保持不变。ps:变量在全局数据区分配内存空间;编译器自动对其初始化,其作用域为局部作用域,当定义它的函数结束时,其作用域随之结束

‘’’Int fun (int x[],int n)

{

Static int sum=0,i;

For(i=0;i<n;i++)sum+=x[i];

Return sum;

}

Main()

{

int a[]={1,2,3,4,5},b[]={6,7,8,9},s=0;//定义a[]时要进行初始化

s=fun(a,5)+fun(b,4);

Printf(“%d\n”,s);

}’’’

此程序中第一次运行fun(a,5)后sum=15,但因在fun函数中定义的为static局部静态变量,因此当计算fun(b,4)的时候,sum此时的值仍为15,即计算fun(b,4)时sum=15+=x[i],因此结果为60.

sum不变的原因即为静态局部变量存储于进程的全局数据区,即使函数返回,它的值也会保持不变。

  1. typedef函数