《K&R》02-类型、运算符与表达式

数据类型

  • char 字符型,占用一个字节(8位)
  • int 整型,shrot int通常是16位,long int通常是32位,int可以是16位也可以是32位。类型限定符signed与unsigned可以用于限定char类型或任何整型。
  • float, double, long double 浮点型

常量

  • 整型常量(如1234)默认为int型,long类型常量以字母l或L结尾(如123456789L),无符号常量以u或U结尾。后缀ul或UL表示unsigned long类型。
  • 没有后缀的浮点数为double类型,后缀f或F表示float类型,后缀l或L表示long double类型。
  • 此外可以用0开头表示8进制,以0x或0X开头表示16进制。8进制和16进制也可以用L表示long类型,用U表示unsigend类型。
  • 字符常量书写时将一个字符括在单引号中(如’x’), 可以像整数一样参与数值运算。
  • 字符串常量(如”hello”), 本质上是一个字符数组。字符串的内部以空字符’\0’作为字符串的结尾,因此存储字符串的物理存储单元数要比双引号中的字符数多一个。strlen(s)返回的字符换长度不包括末尾的’\0’。
  • 枚举常量 enum

// 默认从0开始,即FALSE = 0, TRUE = 1
enum
{
    FALSE,
    TRUE
};
// 依次指定
enum escapes
{
    BELL = '\a',
    BACKSPACE = '\b',
    TAB = '\t',
    NEWLINE = '\n',
    VTAB = '\v',
    RETURN = '\r'
};
// 指定部分 FEB值为2, MAR为3,以此类推
enum months
{
    JAN = 1,
    FEB,
    MAR,
    APR,
    MAY,
    JUN,
    JUL,
    AUG,
    SEP,
    OCT,
    NOV,
    DEC
};

声明

  • 自动初始化:外部变量及静态变量会被初始化为0,自动变量(局部变量)的值为未定义值(即无效值)。
#include <stdio.h>

int m;

int main()
{
    int n;
    printf("%d-%d", m, n); // 0-2130567168

    return 0;
}
  • const限定符限定指定变量的值不能被修改,对数组而言const指定数组所有元素的值不能被修改。
int main()
{
    const int i = 1;
    i = 2; // error: assignment of read-only variable 'i'

    return 0;
}

类型转换

  • 自动转换:一个运算符的几个操作数类型不同时,“比较窄的”类型自动转换为“比较宽的”类型。
    • 转换规则:int -> long -> float -> double -> long double
    • char与short类型的操作数参与运算将被转换为int
  • 强制类型转换:(类型名)表达式
char c = '1';
printf("%d\n", sizeof(c)); // 1
printf("%d\n", sizeof(c + c)); // 4

short s = 2;
printf("%d\n", sizeof(s)); // 2
printf("%d\n", sizeof(s + c)); // 4