运算符求值顺序

来源:互联网 发布:淘宝买家怎么卖淘金币 编辑:程序博客网 时间:2024/04/30 16:58

这里写图片描述

&&与||两个运算符的求值顺序是非常重要的,因为很多判断语句都是基于它们拥有一定的求值顺序才能正确进行的。

eg:
if((num1 != 0) && (num2 / num1 \ > num2 - num1))
上面的if()判断语句合理的运用了&&运算符,使之不会出现0做除数的情况(num1 = 0时),因为&&运算符的求值顺序是从左到右的,且它有一个特性,就是当左边的值为假时,就不用再求右边的值了 —->> &&:与运算符,同真为真,一假为假。
||运算符的规则与&&很相似,求值顺序也是从左到右,且它有一个特性是,当左边的值为真时,就不必再求右边的值了—->>||:或运算符,一真为真,同假为假。

PS:这里穿插一下&& || !与& | ~的区别
前面三个叫逻辑运算符,后面三个叫按位运算符,&& || & | 四个运算符是需要两个操作数的,!和~是只需要一个运算符的。
&&:当左边的操作数为假时,右边的操作数就不再求值了,因为&&运算符要求要两个操作数都为真时表达式才为真,否则就为假。
||:当左边的操作数为真时,右边的操作数就不再求值了,因为||运算符要求要两个操作数有一个为真时表达式就为真,否则才为假。
&和|都要求必须对两个操作数都求值,否则无法计算表达式的结果。

#include<stdio.h>int main(){    int num1 = 0;    int num2 = 10;    if ((num1 != 0) && (num2 / num1 < num2 - num1))    {        num1 += num2 - num1;    }    printf("%d\n", num1);    system("pause");    return 0;}
#include<stdio.h>int main(){    int num1 = 0;    int num2 = 10;    if ((num1 = 0) || (num2 / num1 < num2 - num1))    {        num1 += num2 - num1;    }    printf("%d\n", num1);    system("pause");    return 0;}

所以上面的两段代码都不会因为num = 0时,num2会除 0 而报错,尽量两段代码的输出是不相同的。

#include<stdio.h>int main(){    int num = (1, 2, 3, 4, 5);    printf("%d\n", num);    system("pause");    return 0;}

上面这段代码的输出值为

5

,这就验证了逗号运算符的结果是最右边的值,特别要注意,函数参数之间的分隔符,并不是逗号表达式,它就是一个分隔符。

因为其它运算符是没有求值顺序的,所以不能自己臆想它们的求值顺序来方便自己的编程

#include<stdio.h>int main(){    int arr[10] = { 0 };    int i = 0;    for (i = 0; i < sizeof(arr) / sizeof(arr[0]);)    {        arr[i++] = i;    }    for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)    {        printf("%d\n", arr[i]);    }    system("pause");    return 0;}
#include<stdio.h>int main(){    int arr[10] = { 0 };    int i = 0;    for (i = 0; i < sizeof(arr) / sizeof(arr[0]);)    {        arr[i] = i++;    }    for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)    {        printf("%d\n", arr[i]);    }    system("pause");    return 0;}

上面两段代码尽管都能输出想要的结果,但是它的逻辑却是不严谨的,因为arr[i] = i++和arr[i++] = i这两个语句有漏洞。那arr[i] = i++来说,赋值运算符(=)的求值顺序是不确定的,那么不知道是先算i++,然后arr[i]中的i是进入循环时的i自增之后的值,还是先确定arr[i]中i的值就是进入循环时i的值,然后再进行i++操作。
基于这种不确定性,这两段代码都不是正确的代码。

可以改为

#include<stdio.h>int main(){    int arr[10] = { 0 };    int i = 0;    for (i = 0; i < sizeof(arr) / sizeof(arr[0]);)    {        arr[i] = i;        i++;    }    for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)    {        printf("%d\n", arr[i]);    }    system("pause");    return 0;}

或者

#include<stdio.h>int main(){    int arr[10] = { 0 };    int i = 0;    for (i = 0; i < sizeof(arr) / sizeof(arr[0]);i++)    {        arr[i] = i;    }    for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)    {        printf("%d\n", arr[i]);    }    system("pause");    return 0;}

最后介绍C语言里的唯一一种三目运算符 —->> ?:

用一个实例来说明:
a = 10;
b = 20;
int num = a > b ? a : b;
三目运算符的规则是,先求a > b 成立的话,num = a。不成立的话,num = b。

但是,当上述 a = b时该怎么解决呢?

#include <stdio.h>int main(){    int a = 10;    int b = 10;    int num = a > b ? a + 10 : b + 20;    //int num = a < b ? a + 10 : b + 20;    //当三目运算符比较的两个数据时相同的时,三目运算符所组成的表达式的最终值是":"后面的数据的值    printf("%d\n", num);    system("pause");    return 0;}

输出为30,可以看出当三目运算符比较的两个数据时相同的时,三目运算符所组成的表达式的最终值是”:”后面的数据的值

0 0
原创粉丝点击