• C学习笔记(五)运算符、表达式和语句


    基本运算符

    基本算术运算的运算符:=、+、-、*、/。(C没有指数运算符,用pow()函数代替)

    赋值运算符=

    赋值运算符=把右边的变量或者表达式的值赋给右边的变量。

    #include <stdio.h>
    int main(void)
    {
    int jane,tarzan,cheeta;
    
    cheeta=tarzan=jane=68;
    printf("                        cheeta tarzan jane\n");
    printf("First round score %4d %8d %8d\n",cheeta,tarzan,jane);
    return 0;
    }

    结果如下

                           cheeta tarzan jane
    First round score       68      68    68  

    加法运算符+

    加法运算符+把两边的值加起来。

    income=salary+bribes;
    printf("%d",4+20);

    减法运算符-

    减法运算符-从前面的数减去后面的数。

    takehome=224.00-24.00;

    +和-运算符被称为二元或双值运算符,这表示它们需要两个操作数。

    符号运算符-和+

    这两个运算符用于指示一个值的代数符号。

    rocky=-12;
    smokey=+12;

    乘法运算符*

    表示两数相乘。

    cm=2.45*inch;

    除法运算符/

    用/表示除法。

    整型数的除法和浮点数的除法有很大不同。浮点数除法得到浮点数结果,整数除法得到整数结果。但是整数不能有小数部分,当3去除5的时候,小数部分会被丢弃。

    在C中,整数除法结果的小数部分会被丢弃,这个过程叫截尾。

    #include <stdio.h>
    int main(void)
    {
    printf("integer division: 5/4 is %d \n",5/4);
    printf("integer division: 6/3 is %d \n",6/3);
    printf("integer division: 7/4 is %d \n",7/4);
    printf("floating division: 7./4. is %1.2f \n",7./4.);
    printf("mixed division:7./4 is %1.2f \n",7./4);
    return 0;
    }

    结果如下

    integer division: 5/4 is 1
    integer division: 6/3 is 2
    integer division: 7/4 is 1
    floating division: 7./4. is 1.75
    mixed division: 7./4 is 1.75

    截尾是不会先四舍五入的,会直接将小数部分截掉。

    当混合类型进行除法时,编译器会将两个操作数转变成一致的类型。

    运算符的优先级

     

    其他运算符

    sizeof运算符和size_t类型

    #include <stdio.h>
    int main(void)
    {
    int n=0;
    size_t intsize;
    intsize = sizeof(int);
    printf("n=%d,n has %zd bytes;all ints have %zd bytes.\n",
            n,sizeof n,intsize);
    return 0;
    }    

    sizeof运算符以字节为单位返回其操作数的大小。操作数可以是具体数据对象(如一个变量),或者一个类型(如float)。如果是一个类型,就必须放在括号里。

    C规定sizeof返回size_t类型的值。这是一个无符号整数类型,它不是新类型,而是根据标准类型定义的。

    C有一个typedef机制,它允许为已有的类型创建一个别名。例如:

    typedef double real;

    取模运算符%

    取模运算符用于整数运算。它计算出两数相除的余数。

    增量和减量运算符++和--

     增量运算符将操作数的值加1.它有两种方式出现,++出现在变量前面是前缀模式,在变量后面是后缀模式。

    #include <stdio.h>
    int main(void)
    {
    int ultra=0,super=0;
    while(super<5)
    {
    super++;
    ++ultra;
    printf("super=%d,ultra=%d\n",super,ultra);
    }
    return 0;
    }

    输出结果如下

    super=1,ultra=1
    super=2,ultra=2
    super=3,ultra=3
    super=4,ultra=4
    super=5,ultra=5

    上面程序中的两个增量运算符语句等价于

    super=super+1;
    ultra=ultra+1;

    当然前缀模式和后缀模式是有区别的,以下示例显示了区别

    #include <stdio.h>
    int main(void)
    {
    int a=1,b=1;
    int aplus,plusb;
    
    aplus=a++;
    plusb=++b;
    printf("a aplus b plusb \n");
    printf("%1d %5d %5d %5d\n",a,aplus,plusb);
    return 0;
    }

    结果如下

    a     aplus      b       plusb
    2        1       2         2

    前缀和后缀增量的区别就在于a++是使用a的值后再自增,++a是自增后再使用a的值。

    当然这是当它们和其他运算合用的时候才会有的区别,单独使用增量运算符时是没有区别的。

    自增运算符的优先级

    增量和减量运算符有很高的优先级,只有圆括号比它们的优先级高。

    不要太聪明

     如果一次使用太多的增量运算符,就会出现不期望的结果。

    while(num<21)
    {
    printf("%10d %10d\n",num,num*num++);
    }

    这个程序看起来合理,其实它只能在某些系统上正常工作。问题是当printf()获取要打印的值时,它可能先计算最后一个参数的值,从而在计算其他参数之前增加num的值。所以,结果不会是:

    5       25

    而可能是:

    6       25

    另一个不确定的语句是:

    ans=num/2+5*(1+num++);

    在C中,编译器决定先计算哪个的值,所以如果先计算了num++,那么和先计算num/2就会是两个不同的结果。

    通过两个原则避免这些问题:

    如果一个变量出现在同一个函数的多个参数中时,不要将增量或减量运算符用于它上面。

    当一个变量多次出现在一个表达式里时,不要将增量或减量运算符用于它上面。

    表达式和语句

     表达式(expression)是由运算符和操作数组合构成的。简单的表达式是一个单独的操作数。下面是一些表达式:

    4
    -6
    a*(b+c/d)/20
    q=5*2
    x=++q%3
    q>3

    每一个表达式都有一个值

    这是表达式最重要的属性。例如,

    -4+6,值为2

    c=3+8,值为11

    5>3,值为1

    6+(c=3+8),值为17

    语句

    语句是一条完整的计算机指令。在C中,语句用结束处的一个分号标识。

    #include <stdio.h>
    int main(void)              /*求出前20个整数的和*/
    {
    int count,sum;              /*声明语句*/
    
    count=0;                    /*赋值语句*/
    sum=0;
    while(count++<20)
         sum=sum+count;
    printf("sum=%d\n",sum);     /*函数语句*/
    return 0;
    }

     声明语句用来声明变量。

    赋值语句为变量赋值。

    函数语句引起函数的执行。

    while语句被称为结构化语句。

  • 相关阅读:
    cef 依赖的文件 libcef
    ubuntu 添加新分区,并挂载/home
    x509 证书链验证
    chromium调试
    Chromium智能指针使用指南
    具有扩展主密钥时SSL/TLS的主密钥计算
    OpenSSL解惑2:如何强制选择协议的版本
    基于Gmssl的SM2加解密算法Demo
    漫谈TLS nonce
    VS2015动态库静态加载时指定动态库位置的方法
  • 原文地址:https://www.cnblogs.com/hahazexia/p/3022993.html
Copyright © 2020-2023  润新知