这是我在入门级计算机编程课程中遇到的示例代码:
#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 = 21,m = 10和z = 1 l和z的值是我所期望的,但是m的值让我烦恼。不应该是11,因为代码中存在m ++。
答案 0 :(得分:2)
这是因为@app.route('/api/users/remove_group/<int:groupId>',methods=['DELETE'])
def removeGroup(groupId):
try:
print 'its working--Delete group'
if userGroup.query.filter_by(group_id=groupId).first() is not None:
userGroup.query.filter_by(group_id=groupId).delete()
message='Group removed succesfully\n'
else:
print 'Group not found'
message='Group not found\n'
except HTTPException as error:
return error(os.version)
return message
只会在m++
时执行。由于l++ == 0
评估为l++
,因此永远不会执行20
。如果m++
最初为l
,则会执行0
。
答案 1 :(得分:2)
z= l++ || m++;
在你的表达式中,l
首先赋值,然后递增一个。
在逻辑或(||)操作中,如果左操作数非零,则右操作数未评估且结果是真的。这就是为什么l
成为21
而m未被评估的原因,它的值为10
。
C标准( N1256:6.5.14-第4段)说:
与按位|不同运算符,||运营商保证 从左到右的评价; 之后有一个序列点 评估第一个操作数。如果第一个操作数比较不相等 为0时,不评估第二个操作数。
答案 2 :(得分:0)
您所看到的称为短路评估。
你的话在这里:
z= l++ || m++;
说检查l的值(检查时增加)。如果l不为0,则将z设置为1.如果l为0,则检查m的值(检查时增量)。如果m不为0,则将z设置为1.否则将z设置为0。
基本上,当两个检查中的第一个(l++
)已经评估为真时,系统不需要检查第二个条件,因此它不会,因此也无法增加米。