首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >增量运算符的问题

增量运算符的问题
EN

Stack Overflow用户
提问于 2017-02-06 19:35:51
回答 3查看 79关注 0票数 1

这是我在入门级计算机编程课程中遇到的示例代码:

代码语言:javascript
复制
 #include <stdio.h>
 int main()
 {
     int l = 20, m = 10;
     int z;
     z= l++ || m++;
     printf("z = %d l = %d m = %d\n", z, l, m);
 }

输出l和z的l=21、m=10和z=1值的代码是我所期望的,但m的值让我感到困扰。它不应该是11吗,因为m++出现在代码中。

EN

回答 3

Stack Overflow用户

发布于 2017-02-06 19:41:13

这是因为只有在l++ == 0的情况下才会执行m++。由于l++的计算结果为20,因此永远不会执行m++。如果l最初为0,则将执行m++

票数 2
EN

Stack Overflow用户

发布于 2017-02-06 19:43:04

代码语言:javascript
复制
z= l++ || m++;

在表达式中,l首先赋值,然后递增1。

在逻辑或(||)运算中,如果左操作数为非零,则右操作数为且结果为true。这就是为什么l变成21,而m不求值,它的值是10

C标准(N1256:6.5.14-第4段)说的是:

与按位运算符不同,||运算符保证从左向右求值;在第一个操作数求值之后有一个序列点。如果第一个操作数不等于0,则第二个操作数不会被计算为

票数 2
EN

Stack Overflow用户

发布于 2017-02-06 19:53:35

你所看到的就是短路评估。

你的这一行:

代码语言:javascript
复制
 z= l++ || m++;

也就是说,检查l的值(检查时递增)。如果l不为0,则将z设置为1。如果l为0,则检查m的值(检查时递增)。如果m不为0,则将z设置为1。否则,将z设置为0。

本质上,当两个检查中的第一个(l++)已经计算为真时,系统不需要检查第二个条件,因此它不需要检查,因此也无法增加m。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42066827

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档