tcpl读书笔记:类型与表达式

本文为the c programming language一书的笔记

数据类型和大小

它们的大小由编译器决定,但是有一个规定,short和int至少要16位,long至少要32位。 short必须小于int,int必须小于long

常量

1.23L表示类型为long double。

character function


\a alert \b backspace \f formfeed,used by printer \n newline \r carriage return \t horizontal tab | vertical tab \ backslash ? question mark ' single quote " double quote \ooo octal number \xhh hexadecimal number

定义

为不确定的值。

类型转换

自己很笨,是自己不想思考呢?还是我真的被禁锢了思想。

#include <stdio.h>
#include <string.h>

int str2i(char *str)
{
    int i,len,result;

    len = strlen(str);
    result = 0;
    for(i = 0; i < len; i++){
        result = result * 10 + str[i] - '0';
    }

    return result;
}

int main()
{
    char *s = "543212345";

    printf("%d\n",str2i(s));

    return 0;
}

看到后面才发现,上面这份代码,其实非常水,因为没有考虑负数和其它特殊情况。

-1L < 1U 返回true,因为在比较时1U会转化为signed long。
而-1L < 1UL 则返回false,因为在比较时-1L会转化为unsigned long,变成了一个很大的
正数,因此实际上-1L > 1UL。
int htoi(char *s)
{
    int i,len,result,value;

    len = strlen(s);
    result = 0;
    for(i = 2; i < len; i++){
        if(s[i] >= 'a' && s[i] <= 'z'){
            value = s[i] - 'a' + 10;
        }else if(s[i] >= 'A' && s[i] <= 'Z'){
            value = s[i] - 'A' + 10;
        }else{
            value = s[i] - '0';
        }
        result = result * 16 + value;
    }

    return result;
}

自加自减

三目运算符? :

  1. 打印10个每行
for(i = 0; i < n; i++){
    printf("%d%c",%d,(i % 10 == 9 || i == n - 1) ? '\n' : ' ');
}
  1. 选择是否打印英文后面的复数
printf("%d item%s.\n",n,n == 1 ? "" : "s");

运算符优先级

必要的。

operators assoicativity


() [] -> . left to right ! ~ ++ -- + - * (type) sizeof right to left * / % left to right

xor left to right or left to right && left to right oror left to right ?: right to left = += -= etc right to left , left to right