Press "Enter" to skip to content

Category: C

运算符、表达式和语句

C语言使用运算符来提供多种服务。

每个运算符的特性包括所需操作数的数量、优先级和结合性。当两个运算符共享一个操作数时,最后的两个特性决定了先应用那个运算符。运算符与值结合可以产生表达式,并且C的每一个表达式都有一个值。C允许写出将不同的数值类型组合在一起的表达式。但算术运算要求操作数是同一类型的,所以C进行自动转换。然而,不依赖于自动转换是一个很好的编程习惯。

C有多种运算符,比如赋值和算术运算符。

带一个操作数的运算符(例如负号和sizeof)被称为一元运算符。要求两个操作数的(例如加法和乘法运算符)被称为二元运算符。

表达式是运算符和操作数的组合。

运算符优先级的规则帮助决定当对表达式进行求值时,如何组合表达式的各项。如果运算符有相同的优先级,结合性决定那个运算符先被应用。语句市对计算机的完整指示,在C中使用分号标识。

//min_sec.c -- 把秒转换为分钟和秒
#include<stdio.h>
#define SEC_PER_MIN 60  //定义常量值为每分钟60秒
int main(void){
    int sec,min,left;

    printf("Convert seconds to minutes and seconds!\n");
    printf("Enter the number of seconds(<=0 to quit):\n");
    scanf("%d",&sec);

    while(sec>0){
        min = sec / SEC_PER_MIN;
        left = sec % SEC_PER_MIN;
        /*取模运算(modulus operator)用于整数运算。
        * 该运算符计算出用它右边的整数去除它左边的整数得到的余数。
        * 例如,13%5所得值为3,因为13除以5得2并余3。
         */
        printf("%d seconds is %d minutes. %d seconds\n", sec, min, left);
        printf("Enter next value (<=0 to quit):\n");
        scanf("%d",&sec);
    }
    printf("Done!\n");

    return 0;   
}

字符串和格式化输入输出

//talkback.c -- 一个能为您提供一些信息的对话程序
#include<stdio.h>
#include<string.h> //使用string头文件,提供strlen()函数原型
#include<stdlib.h>
#define DENSITY 62.4
/*预处理定义常量DENSITY
 * 预处理允许定义常量,只需在顶部添加定义。
 * 被称为编译时代入法(compile-time subsitution).
 * 这个被定义的常量称为明显常量(manifest constant)
 * 请注意格式!赋值没有=号,结尾没有;号。#define 常量 值
 * 常量的符号名要全部大写,这是C的传统。
 * 另外,也可使用c_或k_标示常量。
 * 常量的符号名也必须符合变量命名规则。
 * #define 也可以用于定义字符和字符串常量。
 * 前者用单引号,后者用双引号。*/
int main(void){
    float weight,volume;
    int size,letters;
    char name[40];  //有40个字符的一元数组

    //printf()和scanf()被称为输入输出函数,简称为I/O函数。
    printf("Hi! What's your first name?\n");
    scanf("%s",name);   //注意,name没有使用&前缀
    printf("%s,what's your weight in pounds?\n",name);
    scanf("%f",&weight);
    /*使用scanf()来提取变量的值,前面需要加&。
     * 使用scan()把一个字符串读入数组中时,不需要加&*/
    size = sizeof name;
    letters = strlen(name);
    /*strlen()函数以字节为单位给出数据的大小。
     * string.h文件主要包含了与字符串有关的函数原型。*/
    volume = weight / DENSITY;
    printf("Well, %s,"
            " your volume is %2.2f cubic feet.\n",
            name, volume);
    printf("Also, your first name \
has %d letters.\n",letters);
//注意,换行之后有空格也会输出。
    printf("and we have %d bytes to store it in.\n",size);
    /*打印较长的字符串可用的方法有:
    * 使用多个printf();
    * 使用反斜线(/)符号和回车键来结束一行;  
    * 使用字符串连接的方法。如果在一个用双引号引起来的
    字符串后面跟有另一个用双引号起来的字符串,
    而且二者之间仅用空白字符分隔,
    那么C会把该组合当做一个字符串来处理*/
    return 0;
}

标志意义
-项目是左对齐。
+若为正,则显示带+号字符;若为负,则显示带减号字符 。
空格值为正,则显示前导空格;若为负,则带减号。
#转换说明的可选形式,若为%x和%X格式,则以0x或者0X开始。
0对于数字格式用零,而不是空格填充字段宽度。
//width.c   --  字段宽度
#include <stdio.h>
#define PAGES 931
int main(void)
{
    printf("*%-d*\n",PAGES);
    printf("*%2d*\n",PAGES);
    printf("*%10d*\n",PAGES);
    printf("*%-10d*\n",PAGES);
    printf("*%+d*\n",PAGES);
    printf("*%#X*\n",PAGES);
    return 0;
}

数据和C

/* rhodium.c 用金属铑衡量您的体重 */
#include<stdio.h>
int main(void){
    float weight;
    float value;
    printf("Are you worth your weight in rhodium?\n");
    printf("Let's chek it out.\n");
    printf("Please enter your weight in pounds:");

    scanf("%f", &weight);

    value = 770 * weight * 14.5833;
    printf("Your weight in rhodium is worth $%.2f.\n",value);
    printf("You are easily worth that! If rhodium prices drop.\n");
    printf("eat more to maintain  your value.\n");

    return 0;
}

变量与常量的区别在于变量的值可以在程序执行过程中变化与指定,而常量不可以。


整数和浮点数的区别:
1. 整数没有小数部分、浮点数可以有小数部分;
2. 浮点数表示范围大于整数;
3. 对于一些算术运算,浮点数会损失更多精度;
4. 浮点数往往只是实际值的近似;
5. 浮点运算通常比整数运算慢。


int类型市有符号整数,一般取值范围市-32768~32768.系统通过使用一个只是正负符号的特定位来表示有符号整数。

使用printf()打印语句时,切记每个要显示的值都必须对应自己的格式说明符,并且显示值的类型要同说明符相匹配。


/* bases.c -- 十进制书以十进制、八进制、十六进制形式输出 */
#include<stdio.h>
#include<stdlib.h>
int main(void){
    int x;
    printf("Please input your number :\n");
    scanf("%d",&x);

    printf("dec = %d; octal = %o; hex = %x \n",x, x, x);
    printf("dec = %d; octal = %#o; hex = %#x \n",x, x, x);

    return 0;
}

/*charcode.c -- 显示一个字符值的编码值*/
#include<stdio.h>
int main(void){
    char ch;
    ch = getchar();

    printf("The code for %c is %d.\n", ch, ch);
    return 0;   
}

关键字

int,long,short,unsigned,char,double,signed,_Bool,_Complex,_Imaginary

有符号整数

  • int
  • short 或者 short int
  • long 或者 long int
  • long long 或者 long long int

无符号整数

只有0和正值
+ unsigned

字符

  • char

布尔值

_Bool

实浮点数

  • float
  • double
  • long double

复数和虚浮点数

C语言概述

程序(program)由一个或多个函数组成,其中必须有一个名为main()的函数。函数的描述由函数头和函数体组成。函数头(header)包括预处理语句和函数名。可通过圆括号识别一个函数名,圆括号内部可以为空。而函数体(body)位于花括号中并有一系列语句组成,每个语句以一个分号结束。


/*一个简单的C程序*/
#include<stdio.h>
/*
 * 预处理器命令,头文件(header)。
 * 头文件包括了建立最终的可执行程序市编译器需要的信息。
 * 但函数实际代码被包含在库文件中,而不是头文件。
 * 编译器的链接部分负责找到您需要的库代码。
*/

int main(void)
/*
 * 调用main函数,并不接受参数,int表示main()函数返回一个整数。
 * main()是必须开始的函数,是C的基本模块。
 * int指明了函数的返回类型。
 * C90允许使用main(),但C99不允许。建议使用main(void).
 */
 {
//花括号划定了main()函数的界限。
    int num;
    /* 定义一个名为num的变量。这一行叫做声明语句。
     * 说明函数中有一个叫做num的参数,该参数为整数类型。
     * int是C语言的关键字。
     * 在C语言中,所有变量都必须在使用之前定义。
     * 变量命名可供使用的字符有大小写字母、数字和下划线。
     * 第一个字符必须是字母或者下划线。
     * C语言区分大小写。*/
    num = 1;        /*为num赋值,赋值是C的基本操作之一*/

    printf("I am a simple ");   /*调用printf()函数*/
    printf("computer.\n");      /*再次调用printf()函数*/
    printf("My favorite number is %d because it is first.\n",num);
    /* 把num的值给printf()附参,并打印输出,%d表示输出值的位置和形式。
     * printf()是C语言的一个标准函数。圆括号表明printf是一个函数名。
     * 圆括号中的内容是从main函数传递到printf函数的信息,它被成为参数。*/
    return 0;   /*返回语句*/
    /* 返回语句是程序的最后一个语句。int main(void)要求返回一个整数值,
     * 则由return函数返回一个整数值0表示程序的结束。
}   /*结束*/

让程序具有可读性是一个良好的编程习惯。
常用的技巧有:
+ 选择有意义的变量名和使用注释;
+ 使用空行来分隔一个函数概念上多个部分;
+ 每个语句用一行;
+ 程序在开始处用一个注释说明文件的名称和程序的目的;
+ 多个声明


// two_func.c 在一个文件中使用两个函数
#include<stdio.h>
void butler (void);
/* 通知编译器要用到该函数.原型是一种声明的形式,用于告诉编译器使用自定义的函数。
 * butler函数第一个void说明butler()不返回值。
 * 第二个void说明没有参数。
 * void表明是空的,而非无效的。 */
int main(void){
        printf("I will summon the butler function.\n");
        butler();   /*调用函数*/
        printf("Yes. Bring me some tea and writeable CD-ROMS.\n");
        return 0;       
}

void butler(void){  /*函数定义*/
    printf("You rang, sir?\n"); //注意不需要return()函数返回值
}

一门语言的语法就是一套规则,用于管理这种语言中的合法语句组织在一起的方式。语句的语义就是它所表达的意思。编译器可以帮助您发现语法上的错误,但是程序里的语义错误只有在编译完之后才能从程序的行为中表现出来。检测语义错误可能包括跟踪程序的状态,即程序每执行一步之后所有变量的值。

关键字是C语言的词汇。

通过手工方式一步一步的跟踪程序,并记录每个变量,这样就可以监视程序状态。程序状态(program state)是指程序执行过程中的给定点上所有变量值的集合。它是当前计算状态的一个快照。
跟踪程序状态的方法有:
1. 逐步执行程序;
2. 在程序的关键点处加入printf()语句以监视所选变量的值。通过观察变量值的变化来了解程序的执行情况;
3. 使用调试器。调试器是一种程序,它可以一步一步运行另一个程序并检查程序的变量值。