C.Primer.Plus.5e
7.2.1 介绍getchar()和putchar()
前面的多数程序所输入的内容都是数字。为了练习使用其他的形式,让我们来看一个面向字符的例子。
现在我们将接触专门为面向字符I/O而设计的一对C函数:getchar()和putchar()。
.
getchar()函数没有参数,它返回来自输入设备的下一个字符。例如,下面的语句读取下一个输入字符并将它的值赋给变量ch:
ch = getchar();
该语句与下面的语句有同样的效果:
scanf("%c", &ch);
.
putchar()函数打印它的参数。例如,下面的语句将先前赋给ch的值作为字符打印出来:
putchar(ch);
该语句与下面的语句有同样的效果:
printf("%c", ch);
.
因为这些函数仅仅处理字符,所以它们比更通用的scanf()和printf()函数更快而且更简洁。同样,注意到它们不需要格式说明符,因为它们只对字符起作用。这两个函数通常都在stdio.h文件中定义(而且,它们通常只是预处理宏(macro),而不是真正的函数;我们将在16章“C预处理器和C库”中讨论类似函数的宏)。
.
.
7.3.3 求值的顺序
除了那些两个运算符共享一个操作数的情况以外,C通常不保证复杂表达式的哪个部分首先被求值。
例如在下面的语句里,可能先计算表达式5+3的值,也可能先计算9+6的值。
apples = (5 + 3) * (9 + 6)
C语言允许这种不确定性,以便编译器设计者可以针对特定的系统做出最有效率的选择。一个例外是对逻辑运算符的处理。C保证逻辑表达式是从左至右求值的。&&和||运算符是序列的分界点,因此在程序从一个操作数前进到下一个操作数之前,所有的副作用都会生效。而且,C保证一旦发现某个元素使表达式总体无效,求值将立刻停止。这些约定像下面这样的结构成为可能:
while ((c = getchar()) != '' && c != '\n')
这个结构建立一个循环读入字符,直到出现第一个空格符或换行符。第一个子表达式给c赋值,然后c的值被用在第二个子表达式中。如果没有顺序保障,计算机可能试图在c被赋值之前判断第二个子表达式。
.
下面是另外一个例子:
if (number != 0 && 12 / number == 2)
printf("The number is 5 or 6.\n")
如果number值为0,那么第一个子表达式为假,就不再对关系表达式求值。这就避免了计算机试图把0作为除数。很多语言都没有这个特性,在知道number为0后,它们仍将继续后面的条件检查。
.
最后,考虑这个例子:
while (x++ < 10 &&
相关文档:
/加了下面两个头文件,是为了在Win32工程中使用MFC的特性!
#include <afx.h>
#include <afxwin.h>
#include "stdio.h"
#include "conio.h"
////加了下面两句,是为了能够用string(basic_string类型)
#include <string>
using namespace std;
int main(int argc, char* argv[ ......
关于C语言内存方面的话题要真说起来的话那恐怕就没头了,所以本文仅仅是一个浅谈。
关于内存问题
不同平台之间有一定的区别。本文所指的平台是x86的Linux
平台
用C语言做程序(其实其他语言也一样),不仅要熟悉语法,其实很多相关的背景知识也很重要。在学习和研究C语言中内存分配的问题前,首先要了解一下Linux分配给 ......
1.Linux“线程”
进程与线程之间是有区别的,不过Linux内核只提供了轻量进程的支持,未实现线程模型。Linux是一种“多进程单线程”的操作系统。Linux本身只有进程的概念,而其所谓的“线程”本质上在内核里仍然是进程。
大家 ......
用书上的代码拼凑的,还是很有成就感的哈
支持的运算符号有"+","-","*","/","(",")","#"。
支持20位以内无符号整数,当然可以很容易的改成有符号或者是实型数
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define OPSETSIZE 7
//函数结果状态代码
#define TRUE 1
#define FALSE 0 ......