c

A collection of 17 posts

c

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

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

  • wzd
    wzd
c

学习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

  • wzd
    wzd
c

学习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打头的话则表示十六进制。 比如,

  • wzd
    wzd
c

学习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

  • wzd
    wzd
c

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

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

  • wzd
    wzd
c

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

在函数(function)中所声明的变量对于该函数是私有(private)的或者局部(local)的, 其它函数不能直接访问它们。 每一个在函数中的局部变量从该函数被调用起开始存在;当该函数结束退出(exit)的时候, 这些局部变量也随之消失。 这也是为什么这些变量在其它语言当中的术语叫做: 自动(automatic)变量。 除了自动变量外, 我们还有一个选择, 就是将变量定义为对于所有函数而言一个外部(external)的存在(在函数外部定义的外部变量)。 也就是说, 这样定义变量之后, 这些外部变量能通过调用变量名的方式来被其它任意函数访问。 同时, 与局部变量不同的是, 外部变量是永久存在的, 不像局部变量一样只存在于所在(局部变量被定义)函数被调用起至结束退出期间。 一个外部(external)变量必须在任意函数外部被定义(defined)一次(有且只有一次), 以求为其分配存储空间。 而每一个想访问这些外部变量的函数必须在其内部声明(declare)所需要访问的外部变量。(这也声明(state)

  • wzd
    wzd
c

学习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_

  • wzd
    wzd
c

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

在C语言当中, 所有的函数(function)参数(arguments)是以“传值(by value)”的方式来传送的。 这意味着传递给被调用函数的参数值是存储在临时变量当中的而不是原变量。 这使得其与一些以“传址调用(call by reference)”的语言有着特性上的差异(在这些传址调用的程序中, 被调用的程序能直接访问原变量, 而不是和传值调用一样 采用临时变量来存储变量的数据)。 最主要的区别在于, 在C语言当中, 被调用的函数(called function)不能直接更改调用函数(calling function)当中的变量; 它只能更改属于它自己的临时变量(传值参数)。 当然, 有必要的话, 我们还是可以让函数可以变更它的参数变量的。 前提是: 调用者必须提供对应变量的地址(address)(严格来说, 是一个指向该变量的指针(pointer)), 同时被调用的函数也要声明该参数为指针, 然后被调用的函数就能通过这样的方式间接地访问原变量了。 不过,

  • wzd
    wzd
c

学习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

  • wzd
    wzd
c

学习C第一章入门篇5: 字符输入与输出

由标准库(Standard Library)支持的输入输出模型是非常简单的。文本的输入与输出是以字符流(streams of characters)的形式被处理的。 一个字符流(text stream)是一序列(sequence)被分至数行的字符。每一行都由零个或者多个字符(character)构成, 并且每一行末跟了一个换行符(newline character)。 库(Libraby)的职责就是使得每一个输入流或者输出流满足这个模型。 标准库(Standard Libraby)提供了一系列用于一次读写单个字符的函数(function),而其中函数getchar以及putchar是最简单的。 每次被呼叫的时候,getchar会在一个文本流(text stream)中读取下一个输入字节(input character)然后将其作为函数返回值返回。 字符们通常情况下来自于键盘输入。 函数putchar是在每次被呼叫的时候打印(print)一个字符。 通常是打印在屏幕(screen)

  • wzd
    wzd
c

学习C第一章入门篇4: 符号常量

一行**#define**语句定义了一个符号名或者一个符号常量(symbolic constant)为一个特别/特定的字符串(string): #define name replacement-text 自此以后, 所有出现name(不包括引号""里的name或者其它名字中的一部分包含name的情况)的地方都由replacement-text替换。 name跟变量名(variable name)有着一样的形式: 由一个字母开头的一组字母和数字组成的序列。 至于replacement-text[1]可以是任何一组由字符(character)组成的序列。 符号常量(symbolic constant)通常写成大写形式以更容易地和小写的变量名(variable name)区别开来。 此外, 要注意#define语句结尾是没有;的。 例如: #define HALLO 123 数字(

  • wzd
    wzd
c

学习C第一章入门篇3: 循环语句

在实际生活中, 在编写程序时, 我们可能会遇到一些情况, 比如说, 依次输出1, 2, 3, 4, 5. 根据[第一章入门篇1][1.1]当中的体会,我们觉得可以依次输出12345, 例如: printf("2"); ``` ...... `printf("5"); ` 我们此刻会想,既然我们的输出是有逻辑顺序的, 那我们是否可以通过程序为我们免除手工输入不必要的输出语句呢,尤其是在输出的数量非常大的情况下。 这个时候, 循环(loop)就出现了, 在此我们就采用for循环好了(以后的章节中再简单叙述)。 代码说话: <pre class="line-numbers" data-line="6-8&

  • wzd
    wzd
c

学习C第一章入门篇2: 变量和算数表达式

在程序当中我们总是会用到变量去记录必要的数值, 也常常会用到算数的计算。 比如, 一到应用题: 小莉今年7岁,爷爷比小莉大48岁,妈妈比爷爷小36岁。问:妈妈今年多少岁? // howoldismama.c #include <stdio.h> main() { int xiaoli, opa, mom; xiaoli = 7; opa = 7 + 48; mom = opa - 36; printf("Mama is %d years old. \n", mom); } 编译源文件: gcc howoldismama.c 执行: gcc

  • wzd
    wzd
c

学习C第一章入门篇1: Hello World

众所周知, 学习每一门计算机语言常用的开端便是“Hello World” 我们也不免俗地以此来开端重头学习C语言。 下面是我们学习C的第一个程序用以在终端输出字符串“Hello World”。 // hello_world.c #include <stdio.h> main() { printf("Hello, World\n"); } 之后, 假设我们是在Linux系统下的话, 在Shell中用gcc将所写代码编译成二进制可以直接在机器上运行的程序。 假设在Shell中, 我们定位自己至hello_world.c所在目录(用pwd查看当前目录, 用cd来切换目录, 用ls来列举指定目录下的文件)后, 输入如下方展示的命令进行编译。 gcc hello_world.c 由于运行gcc编译器的时候没有加参数, 所以默认是在当前所在目录下生成一个名为a.out的可执行二进制程序[1]。 然后再运行这个生成的文件。 gcc hello_

  • wzd
    wzd
c

学习C

对于C的接触最早追溯到初中时期, KT同学借给我的谭浩强的C, 但由于本人愚钝。 结果其实是并没怎么了解C。 在进入大学之后, 首次接触C是因为Rechnerstrukturen und Betriebssysteme 1这门课。 在Praktikum中以及Übung上常常需要用C在Linux跑, 由于所在大学是以Java为入门学习语言的, 也没怎么详细介绍C就开始用C写。 此后的RB2以及PK2两门课上也经常用到C。 在实践操作中, 觉得C甚为重要, 于是乎便产生了从头开始系统性学习C并尽可能好地掌握C的想法。 至于所选书籍, 倒是有之前国内带过来谭浩强的C,以及后来买的《C Programming Absolute Beginner's Guide》和《The C Programming Language》 看了一小段时间的中文版本(谭的版本), 我觉得有点看不下去, 便放弃了该书。 理由是: 外文 德文版也好英文版也好 固然难懂, 毕竟非母语此外自己的外文水平也不够, 但是看了中文更加生涩难懂, 不如看外文版(而且很多原版就是英文写的, 看原版能尽可能地多接触到原作者的想法与了解原作者的思路)。 前些天转《C

  • wzd
    wzd