Life Recording

~Make Memories Last Forever~

All Posts Under: c

学习C第二章类型、运算符和表达式6: 关系和逻辑运算符

关系运算符(relational operators)有: > >= < <= 它们有着相同的优先权(precedence)。 优先权仅次于它们(小于它们)的是相等运算符(equality operators): == != 关系运算符的优先权较算术运算符要低, 所以表达式, 如i<lim-1等同于i<(lim-1)。 涉及到逻辑运算符&&和||的表达式从左到右求值, 只要结果的真假已知, 那么求值就结束。 比如&&运算符中: (3<2) && (2>4), 前者3<2求值结果为: false; 那么后面的(2>4)也就不需要求值了, 因为无论如何该&&的结果始终为false了; ||同理, 略有变化, (3>2) || (2>4) 的话, 前者(3>2)…
Continue Read

学习C第二章类型、运算符和表达式5: 算术运算符

二元运算符有 +, -, *, /, 取余操作符%。 %运算符不能用在float和double上面。 二元运算符+和-有着一样的优先权(precedence), 而运算符*, / 还有%的优先权比前者要高, 另外一元运算符+和-的优先权要高于前两者。 参考: 《The C Programming Language》- Chapter 2.5…
Continue Read

学习C第二章类型、运算符和表达式4: 声明

所有的变量在使用前都要被定义(declared)。 定义指定了类型(type),并且包括了一系列的(一个或多个)该类型的变量, 比如: int lower, upper, step; char c, line[1000]; 变量也可以在声明的同时初始化。 如下所示, 变量名后面紧跟着等号和对应的表达式: char esc = '\\'; int i = 0; int limit = MAXLINE + 1; float eps = 1.0e-5; 修饰词const可以和变量的声明结合使用, 使得变量的值不能再被改变。 对于一个数组, const修饰词表示其元素不能再被改变了。 const double e = 2.71828182845905; const char msg[] = "warning: "; const修饰词还可以和数组参数一起结合使用, 表明函数不能改变数组: int strlen(const char[]); 参考:…
Continue Read

学习C第二章类型、运算符和表达式3: 常数

整数(integer)常数(constant)1234是一个int。 long常数是在末尾以l或者L结尾, 比如123456789L; 一个整数如果大到不能适配int, 那么会被当做long来处理。 无符号(unsigned)常数是以u或者U作为结尾, ul或UL表示unsigned long。 浮点(floating-point)常数包含了小数点(decimal point)(123.4) 或者 指数(exponent)(1e-2) 或者 两者兼有; 在没有后缀(suffix)指定说明的情况下, 它们的类型是属于double的。 后缀f或者F指的是float常数; 而l或L则表示long double。 整数的值还可以指定用八进制(octal)或十六进制(hexadecimal)来表示, 而不必一定要十进制(decimal)。 在一个整数常数中0打头表示八进制; 而如果是0x或者0X打头的话则表示十六进制。 比如, 十进制下的31可以写作用八进制来表示的037或者用十六进制下来表示的0x1f或者0X1F。 八进制和十六进制常数后面仍然可加上L来表示long以及U来表示unsigned: 0XFUL表示的是一个无符号的long*常数, 其值用十进制来表示的话是15。 字符(character)常数是整数, 其写法是'X'(所代表的字符通过单引号括起来)。 字符常数的值等于其表达的字符在机器字符表中的值。 比如, 在ASCII字符表中, 字符常数'0'的值是48。 特定的字符可以通过转义字符来表示, 如\…
Continue Read

学习C第二章类型、运算符和表达式2: 数据类型和大小

2.2学习C第二章类型、运算符和表达式2: 数据类型和大小 在C语言当中, 只有以下几种基本的数据类型(data types): Type Description char a single type, capatable of holding one character in the local character set. int an integer, typically reflecting the natural size of integers on the host machine. float single-precision floating point. double double-precision floating point. 此外, 还有些适用于这些基本数据类型的修饰词(qualifier)。 short 和 long 用于整数类型(integers): short int sh; long int counter;…
Continue Read

学习C第二章类型、运算符和表达式1: 变量名

第二章前言 变量(Variables)和常量(constants)是程序中基本的数据处理对象。 声明(Declarations)列举了那些会被用到的变量, 同时也声明了这些变量所含有的类型(type)以及可能持有的初始值。 运算符(Operators)指定了作用于这些变量上的运算。表达式(Expressions)与变量和常量相结合去得到新值。 一个对象的类型决定了其值域以及能够作用在其身上的运算。 ASCI标准对于基本的类型和表达做了很多细微的改动和增添。 现在对于所有的整数(integer)类型有了有符号的(signed)和无符号的(unsigned)两种形式, 对于无符号的(unsigned)以及十六进制的(hexadecimal)常量有了记号。 浮点运算(Floating-point operations)可在单精度的情况下来完成; 此外, 还有long double类型以供更高的精度。 字符常量可在编译(compile)时连起来。 枚举(Enumerations)也成为了C语言的一部分。 变量名 对于变量(variables)名及符号常量(symbolic constants)名来说, 其实它们的命名是有限制的。 它们的名字由字母(letters)数字(digits)组成。 其中, 第一个字符必须是一个字母(…
Continue Read

学习C第一章入门篇10: 外部变量和作用域

在函数(function)中所声明的变量对于该函数是私有(private)的或者局部(local)的, 其它函数不能直接访问它们。 每一个在函数中的局部变量从该函数被调用起开始存在;当该函数结束退出(exit)的时候, 这些局部变量也随之消失。 这也是为什么这些变量在其它语言当中的术语叫做: 自动(automatic)变量。 除了自动变量外, 我们还有一个选择, 就是将变量定义为对于所有函数而言一个外部(external)的存在(在函数外部定义的外部变量)。 也就是说, 这样定义变量之后, 这些外部变量能通过调用变量名的方式来被其它任意函数访问。 同时, 与局部变量不同的是, 外部变量是永久存在的, 不像局部变量一样只存在于所在(局部变量被定义)函数被调用起至结束退出期间。 一个外部(external)变量必须在任意函数外部被定义(defined)一次(有且只有一次), 以求为其分配存储空间。 而每一个想访问这些外部变量的函数必须在其内部声明(declare)所需要访问的外部变量。(这也声明(state)了相应变量对应的变量类型)。 这个声明(declaration)可以是明确地用extern来声明, 也可以是有时根据所处的环境不必用extern来特别声明了。 在书中, 给出的例子缩略后如下: #include <stdio.h> #define MAXLINE 1000 int…
Continue Read

学习C第一章入门篇9: 字符数组

这一小节我就简单关注一下 字符数组的一个小细节。 比如, 当我们有一个字符串, “hello\n”, 显示在一个C程序当中。 事实上, 这是以字符数组“hello\n\0”的形式存储的。 (\0是空(null)字符, 其值为0)(\0在这里用来作标记结尾之用) 书后练习题1-17: Write a program to print all input lines that are longer than 80 characters. 我写的版本: #include <stdio.h> #define MAX 1000 int getline_alt(char[], int); int main() { int counter; char line[MAX]; counter = 0; while ((counter =…
Continue Read

学习C第一章入门篇8: 传值参数

在C语言当中, 所有的函数(function)参数(arguments)是以“传值(by value)”的方式来传送的。 这意味着传递给被调用函数的参数值是存储在临时变量当中的而不是原变量。 这使得其与一些以“传址调用(call by reference)”的语言有着特性上的差异(在这些传址调用的程序中, 被调用的程序能直接访问原变量, 而不是和传值调用一样 采用临时变量来存储变量的数据)。 最主要的区别在于, 在C语言当中, 被调用的函数(called function)不能直接更改调用函数(calling function)当中的变量; 它只能更改属于它自己的临时变量(传值参数)。 当然, 有必要的话, 我们还是可以让函数可以变更它的参数变量的。 前提是: 调用者必须提供对应变量的地址(address)(严格来说, 是一个指向该变量的指针(pointer)), 同时被调用的函数也要声明该参数为指针, 然后被调用的函数就能通过这样的方式间接地访问原变量了。 不过, 要注意的是, 数组(array)的情况。 当一个数组的名字作为一个函数的参数的时候, 传递给被调用函数的值是数组开头的位置(location)或者说地址(address)。 如果要访问或者变更数组当中的制定元素的值, 我们可以采用输入数组下标(subscript)的方式。 参考: 《The C…
Continue Read

学习C第一章入门篇7: 函数

函数的定义格式(function definition)如下: return-type function-name(parameter declarations, if any) { declarations statements } 由函数计算并返回的值是通过return语句(statement)来实现. return后面可以跟任何表达式: return expression; 函数并不需要返回一个值。一个不带表达式(expression)的return语句用来起到控制的作用,控制函数的终止(terminate),它并不会返回给调用者一个有效的返回值。   在平时,我们会留意到在main函数的末尾有一个return语句。因为main也同样是和其它函数一样可能会返回给调用者,对于main来说,调用者实际上是程序所运行的环境。通常而言,返回值为0表示的是:正常的终止; 而返回值为非0表示的是:无用(unusual)或者错误(erroneous)的终止条件(termination conditions) 声明(declaration): int function1(int m, int n) 该声明处于main函数之前用来表明function1是一个期望得到两个int类型的参数并且返回值是int类型的函数(function)。 这样的声明,我们称之为函数原型(function prototype),并且该声明要和函数function1的定义(definition)和使用(uses)保持一致。…
Continue Read