c primer plus 专题5:运算符、表达式和语句

1 循环简介

1 应该让计算机做一些重复性的工作,在这里使用 while 循环

#include <stdio.h>
#define ADJUST	7.31	
int main(void)
{
    const double SCALE = 0.333;     // const 变量
    double shoe, foot;

    printf("Shoe size (men's)   foot length\n");
    shoe = 3.0;
    while (shoe < 18.5)             /* while 循环开始 */
    {                               /* 块开始 */
        foot = SCALE * shoe + ADJUST;
        printf("%10.1f %15.2f inches\n", shoe, foot);
        shoe = shoe + 1.0;
    }                               /* 块结束 */
    printf("If the shoe fits, wear it.\n");

    return 0;
}

程序执行结果

ding@ding-ubuntu:~/primer$ ./a.out 
Shoe size (men's)   foot length
       3.0            8.31 inches
       4.0            8.64 inches
       5.0            8.97 inches
       6.0            9.31 inches
    ...
      17.0           12.97 inches
      18.0           13.30 inches
If the shoe fits, wear it.

2 基本运算符

1 赋值运算符  =

在C语言中,= 并不意味着“相等”,而是一个赋值运算符。赋值行为,从右往左进行。

数据对象、左值、右值和计算符

2 符号运算符:+ 和 -,表示数据的正负

3 除法运算符

在进行除法运算时,要注意截断,C99规定使用“趋零截断”。

4 运算符的优先级

下面这条语句中,包含加法、乘法和除法,应该先计算哪一个?

butter = 25.0 + 60.0 * n / SCALE;

计算顺序:

运算符的优先级

5 优先级和求值顺序

具体先计算f()还是g(),由硬件决定,C语言没有做出具体规定。

3 其他运算符

1 sizeof typedef

2 求模运算符 %

#include <stdio.h>
#define SEC_PER_MIN     60      // 1 分钟 60 秒
int main(void)
{
    int sec, min, left;

    printf("Convert seconds to nimutes 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;   // 剩下的秒数
        printf("%d seconds is %d minutes, %d seconds.\n", sec, min, left);
        printf("Enter next value (<=0 t oquit) : \n");
        scanf("%d", &sec);
    }
    printf("Done!\n");

    return 0;
}

3 自增运算符 ++

前缀形式和后缀形式的区别(直接看顺序):

i++ 先使用变量 i 的值,完成这行语句后,再将 i + 1;

++i 先将变量 i + 1,然后进行运算;

4 递减运算符 --

5 优先级

所以,一定要避免下面这样的程序:

int n = 3, y;

y = n++ + n++;
printf("n = %d, y = %d\n", n, y);

4 表达式和语句

1 表达式

类似于 y = 5 + (x = 3 + 8),这种表达式完全合法,但不建议使用。

2 语句

如下所示为一条空语句,在程序中什么都不做;

;    // 空语句

3 副作用和序列点

在C语言中,所有的副作用都必须在下一条语句之前完成。

4 复合语句(块)

5 隐式类型转换

在执行算术运算时,计算机比C语言的限制更多。为了让计算机执行算术运算,通常要求操作数有相同的大小(即位的数量相同),并且要求存储的方式也相同。计算机可能可以直接将两个16位整数相加,但是不能直接将16位整数和32位整数相加,也不能直接将32位整数和32位浮点数相加。另一方面,C语言允许在表达式中混合使用基本数据类型。在单独一个表达式中可以组合整数、浮点数,甚至是字符。当然,在这种情况下C语言编译器可能需要生成一些指令将某些操作数转换成不同类型,使得硬件可以对表达式进行计算。例如,如果对16位int型数和32位long int型数进行加法操作,那么编译器将安排把16位int型值转换成32位值。如果是int型数据和float型数据进行加法操作,那么编译器将安排把int型值转换成为float格式。这个转换过程稍微复杂一些,因为int型值和float型值的存储方式不同。因为编译器可以自动处理这些转换而无需程序员介入,所以这类转换称为隐式转换(implicit conversion)。C语言还允许程序员通过使用强制运算符执行显式转换(explicit conversion)。首先讨论隐式转换,,执行隐式转换的规则有些复杂,主要是因为C语言有大量不同的基本数据类型(6种整型和3种浮点型,这还不包括字符型)。

注意:当把有符号操作数和无符号操作数整合时,会通过把符号位看成数的位的方法把有符号操作数"转换"成无符号的值.这条规则可能会导致某些隐蔽的编程错误。

6 强制类型转换

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值