重新夯实基础,the c programingn language 再读笔记之类型、运算符与表达式

来源:互联网 发布:软件研发立项报告模板 编辑:程序博客网 时间:2024/04/30 13:16

    变量和常量是程序处理的两种基本数据对象。声明语句说明变量的名字及类型,也可以指定变量的初值。运算符指定将要进行的操作。表达式则把变量与常量组合起来生成新的值。对象的类型决定该对象可取值的集合以及可以对该对象执行的操作。

    

      变量名规则:名字是由字母和数字组成的序列,但其第一个字符必须为字母。下划线“_”被看做是字母,变量名不要以下划线开头。在传统的C语言用法中,变量名使用小写字母,符号常量名全部使用大写字母。不能把关键字用做变量名。

   

     变量类型:short 与long 两个限定符的引入可以为我们提供满足实际需要的不同长度的整型数。int 通常代表特定机器中整数的自然长度。short 类型通常为16 位,1ong 类型通常为32位,int 类型可以为16 位或32 位。各编译器可以根据硬件特性自主选择合适的类型长度,但要遵循下列限制:short与int类型至少为16 位,而long类型至少为32 位,并且short类型不得长于int类型,而int类型不得长于long类型。

 

     变量的基本类型:char、int、float、short;修饰类型:signed、unsigned、long、short(后两种只修饰int)

     获取每种数据类型最大,最小值方法:

   /*打印各种类型数据的最大最小值*/
    printf("UCHAR MAX = %u /n",UCHAR_MAX);
    printf("UCHAR MIN = %d /n",0);
    printf("CHAR MAX = %d /n",CHAR_MAX);
    printf("CHAR MIN = %d /n",CHAR_MIN);

    printf("USHORT MAX = %u /n",USHRT_MAX);
    printf("USHORT MIN = %d /n",0);
    printf("SHORT MAX = %d /n",SHRT_MAX);
    printf("SHORT MIN = %d /n",SHRT_MIN);
 
    printf("UINT MAX = %u /n",UINT_MAX);
    printf("UINT MIN = %d /n",0);
    printf("UINT MAX = %d /n",INT_MAX);
    printf("UINT MIN = %d /n",INT_MIN);

    printf("ULONG MAX = %u /n",ULONG_MAX);
    printf("ULONG MIN = %d /n",0);
    printf("ULONG MAX = %d /n",LONG_MAX);
    printf("ULONG MIN = %d /n",LONG_MIN);
/****************************************/
    printf("/n/n/n");
    printf("UCHAR MAX = %u /n",(unsigned char)~0);
    printf("UCHAR MIN = %d /n",0);
    printf("CHAR MAX = %d /n",(char)(((unsigned char)~0)>>1));
    printf("CHAR MIN = %d /n",~(char)(((unsigned char)~0)>>1));

    printf("USHORT MAX = %u /n",(unsigned short)~0);
    printf("USHORT MIN = %d /n",0);
    printf("SHORT MAX = %d /n",(short)(((unsigned short)~0)>>1));
    printf("SHORT MIN = %d /n",~(short)(((unsigned short)~0)>>1));
 
    printf("UINT MAX = %u /n",(unsigned int)~0);
    printf("UINT MIN = %d /n",0);
    printf("UINT MAX = %d /n",(int)(((unsigned int)~0)>>1));
    printf("UINT MIN = %d /n",~(int)(((unsigned int)~0)>>1));

    printf("ULONG MAX = %u /n",(unsigned long)~0);
    printf("ULONG MIN = %d /n",0);
    printf("ULONG MAX = %d /n",(long)(((unsigned long)~0)>>1));
    printf("ULONG MIN = %d /n",~(long)(((unsigned long)~0)>>1));

 

   常量:整数常量;修饰:L  U  F  0  H

           一个字符常量是一个整数,书写时将一个字符括在单引号中,如,'x'。字符在机器字符
     集中的数值就是字符常量的值

           字符串常量也叫字符串字面值,是用双引号括起来的0 个或多个字符组成的字符序列。

    我们应该搞清楚字符常量与仅包含一个字符的字符串之间的区别:'x'与"x"是不同的。
前者是一个整数,其值是字母x 在机器字符集中对应的数值(内部表示值);后者是一个包含
一个字符(即字母x)以及一个结束符'/0'的字符数组。

    枚举常量是另外一种类型的常量。枚举是一个常量整型值的列表,例如:
enum boolean { NO, YES };

   2.   枚举元素本身由系统定义了一个表示序号的数值,从0开始顺序定义为0,1,2…。如在weekday中,sun值为0,mon值为1,…,sat值为6。
【例11.10】
main(){
    enum weekday
    { sun,mon,tue,wed,thu,fri,sat } a,b,c;
    a=sun;
    b=mon;
    c=tue;
    printf("%d,%d,%d",a,b,c);
}

说明:
只能把枚举值赋予枚举变量,不能把元素的数值直接赋予枚举变量。如:
    a=sum;
b=mon;
是正确的。而:
    a=0;
b=1;
是错误的。如一定要把数值赋予枚举变量,则必须用强制类型转换。
如:
    a=(enum weekday)2;
其意义是将顺序号为2的枚举元素赋予枚举变量a,相当于:
    a=tue;
还应该说明的是枚举元素不是字符常量也不是字符串常量,使用时不要加单、双引号。

 

   声明:

     默认情况下,外部变量与静态变量将被初始化为0。未经显式初始化的自动变量的值为未定义值(即无效值)。任何变量的声明都可以使用const限定符限定。该限定符指定变量的值不能被修改。对数组而言,const限定符指定数组所有元素的值都不能被修改。

 

如果没有unsigned 类型的操作数,则只要使用下面
这些非正式的规则就可以了:
· 如果其中一个操作数的类型为long double,则将另一个操作数转换为1ong
double类型;
· 如果其中一个操作数的类型为double,则将另一个操作数转换为double类型;
· 如果其中一个操作数的类型为float,则将另一个操作数转换为float类型;
· 将 char与short类型的操作数转换为int类型;
· 如果其中一个操作数的类型为long,则将另一个操作数也转换为long类型。

 

注意,表达式中float类型的操作数不会自动转换为double类型,这一点与最初的定
义有所不同

 

 

当表达式中包含unsigned 类型的操作数时,转换规则要复杂一些。

首先转换为较宽类型;如果宽度相同则转换为无符号类型。主要原因在于,带符号值与无符号值之间的比较运算是与机器相关的,因为它们取决于机器中不同整数类型的大小。例如,假定int类型占16 位,long类型占32位,那么,-1L < 1U,这是因为unsighedint 类型的1U 将被提升为signed long 类型;但-1L > 1UL,这是因为1L 将被提升为unslgned long类型,因而成为一个比较大的正数。赋值时也要进行类型转换。赋值运算符右边的值需要转换为左边变量的类型,左边变量的类型即赋值表达式结果的类型。前面提到过,无论是否进行符号扩展,字符型变量都将被转换为整型变量。

 

赋值运算符右边的值需要转换为左边变量的类型。

 

在任何表达式中都可以使用一个称为强制类型转换的一元运算符强制进行显式类
型转换。

 

 

 

按位与运算符&经常用于屏蔽某些二进制位,
按位或运算符|常用于将某些二进制位置为1,
按位异或运算符^当两个操作数的对应位不相同时将该位设置为1,否则,将该位设置为
0。

 

 

 

条件表达式

z = (a > b) ? a : b;

 

表 2-1 运算符的优先级与结合性
运算符结合性
() [] -> . 从左至右
! ~ ++ -- + - * (type) sizeof 从右至左
* / % 从左至右
+ - 从左至右
<< >> 从左至右
< <= > >= 从左至右
== != 从左至右
& 从左至右
^ 从左至右
| 从左至右
&& 从左至右
|| 从左至右
?: 从左至右
= += -= *= /= %= &= ^= |= <<= >>= 从右至左
, 从右至左
注:一元运算符+、-、&与*比相应的二元运算符+、-、&与*的优先级高