为啥 j 在 (++i || ++j) 中不递增

     2023-05-08     60

关键词:

【中文标题】为啥 j 在 (++i || ++j) 中不递增【英文标题】:Why isn't j incremented in (++i || ++j)为什么 j 在 (++i || ++j) 中不递增 【发布时间】:2018-09-06 09:12:14 【问题描述】:

我不明白这段代码的输出:

 long i=5, j=10;
 if (++i || ++j)  printf("%ld  %ld\n", i, j);
 else  printf("Prog1\n");

输出是 6 和 10。我希望是 6 和 11。为什么 j 没有增加?

【问题讨论】:

您的 if 语句正在评估 OR 语句,因此首先在管道左侧读取 ++i ||和增量。它忽略了 ++j,因此它最终是 6 和 10... 我不知道你为什么要这样做,但你可能不应该......你想在这里达到什么效果? 【参考方案1】:

逻辑或运算符||short circut operator。这意味着如果仅通过查看左侧操作数即可确定结果,则不会计算右侧操作数。

C standard 的第 6.5.14 节有关逻辑 OR 运算符的声明如下:

4 与按位 | 运算符不同,|| 运算符保证 从左到右的评估;如果计算第二个操作数,则有 第一个和第二个评估之间的序列点 操作数。 如果第一个操作数比较不等于 0,则第二个 不计算操作数。

在这种情况下,++i 被求值,结果为 6(具​​有递增i 的副作用。如果任一操作数非零,则逻辑 OR 运算符求值为 1(即真)。由于左侧非零,不计算右侧,随后j 不递增。

【讨论】:

【参考方案2】:

您的 if 条件使用短路逻辑 OR 运算符 ||。由于运算符左侧 (++i) 的计算结果为 true,因此右侧 (++j) 不会被执行。

【讨论】:

【参考方案3】:

if 语句中只执行了++i,因为++i 不为零并且已经被视为true。因为|| OR 操作,所以不需要执行++j

【讨论】:

最长递增子序列

方法一:用LCS的方法,计算序列a与排序后的序列b之间的最长公共子序列。在这里用了快速排序,然后再用LCS方法。voidquiksort(inta[],intstart,intend){inttemp=a[start];inti=start,j=end;if(i<j){while(i<j){while(i<j&&a[j]>temp)j--;a[i]=a[j] 查看详情

连续递增最长自序列

解法O(n^3)O(n^2)O(nlogn)O(n)(当j确定时,S【j】-S【i-1】最大即可,就需要找到最小的S【i】,便利一遍数组即可)三个for循环i,j=i&j<n,k=i&k<j,sum+=a[k]两个for循环,找出前i项和。i,j=i&j<n,best=max(best,S【j】-S[... 查看详情

在mybatis中xml中不等于怎么写

参考技术Ainta[][4]=3,16,87,65,4,32,11,108,10,25,12,27;intb[3],i,j,l;for(i=0;i<=2;i++)l=a[i][0];for(j=1;j<=3;j++)if(a[i][j]>l)l=a[i][j];b[i]=l;printf("\narraya:\n");for(i=0;i<=2;i++)for(j=0;j<=3;j++)printf("%5d",a[i][j]);printf("\n");printf... 查看详情

luogu4728双递增序列(dp)(代码片段)

...+1][j+1],f[i][j]$;$f[i+1][i-j+1]=minf[i+1][i-j+1],a[i+1]$,如果能满足递增的话1#include<bits/stdc++.h>2#defineCLR(a, 查看详情

最长递增子序列(代码片段)

最长递增子序列(递增子序列会了,递减子序列也就没问题了)第一种思路:a[i]在最长子序列的位置为dp[i]dp[i]=max(1,dp[j]+1) s.t.0<=j<i 且a[j]<a[i]第二种思路:对a[i]排序的b[i]求a[i]与b[i]的最长公共... 查看详情

最长递增子序列(代码片段)

最长递增子序列(递增子序列会了,递减子序列也就没问题了)第一种思路:a[i]在最长子序列的位置为dp[i]dp[i]=max(1,dp[j]+1) s.t.0<=j<i 且a[j]<a[i]第二种思路:对a[i]排序的b[i]求a[i]与b[i]的最长公共... 查看详情

线性筛

prime[]数组中的素数是递增的,当i能整除prime[j],那么i*prime[j+1]这个合数肯定被prime[j]乘以某个数筛掉。因为i中含有prime[j],prime[j]比prime[j+1]小,即i=k*prime[j],那么i*prime[j+1]=(k*prime[j])*prime[j+1]=k’*prime[j],接下去的素数同理。所以不... 查看详情

剑指offer----1.二维数组查找

...比这个元素大就往右找。如果出了边界,则说明二维数组中不存在target元素。答案:classSolutionpublic:boolFind(inttarget,vector<vector<int>>array)if(array.empty())returnfalse;introws=array.size();intcols=array[0].size();inti=rows-1,j=0;while(i>=0&&... 查看详情

求最长单调递增子序列

  //求最长单调递增子序列#include<stdio.h>#defineMAXN20voiddisp(inta[],intb[],intk) inti; for(i=k-1;i>0;i--) if(b[k]==b[i]+1&&a[i]<=a[k]) disp(a,b,i); break; printf("%d",a[k]);intmaxL(intb[],intn) //求数组b中最大值下标k inti,k=0; intmax=b[0]; f... 查看详情

剑指no1

...中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。publicstaticvoidmain(String[]args... 查看详情

convertTo 在 opencv 中不起作用

】convertTo在opencv中不起作用【英文标题】:convertTonotworkinginopencv【发布时间】:2016-01-1201:12:14【问题描述】:我正在尝试在opencvC++中使用convertTo()。但是弹出一个错误提示leftof:convertTo必须有类/结构/联合程序如下:for(i=0;i<height... 查看详情

matlab中if、else语句运算结果为啥只显示最后一个if的值?

参考技术Aifh(i,j)==a1(i,j)e(i,j)=a(i,j);elseifh(i,j)==b1(i,j)e(i,j)=b(i,j);elseifh(i,j)==c1(i,j)e(i,j)=c(i,j);elseh(i,j)==d1(i,j)e(i,j)=d(i,j);end对这一段程序仔细分析,我没有仔细分析前面的程序,但可以猜测以下,h(i,j)肯定会和a1(i,j)、b1(i,j)、c1(i,j)、d1(i,j... 查看详情

斜率优化

斜率优化说明(本文中所有的单调递增递减都不是绝对的,根据实际情况灵活使用)对于形如\(f[i]=max\)\(f[j]+a[i]+b[i]*c[j]\)的状态转移方程,若\(b[i]\)是单调递增的(可以是递减,但维护方式就不同了,下面不再说明),那么我们可以对... 查看详情

动态规划-最长递增子序列

1、问题:给出长度为N的数组,找出这个数组的最长递增子序列。 (递增子序列是指,子序列的元素是递增的) 递推公式:  2、原理分析:假设开始计算位置i,当位置i之前的所有记录都大于位置i的值时,L(i) =... 查看详情

算法实践--最长递增子序列(longestincreasingsubsquence)(代码片段)

什么是最长递增子序列(LongestIncreasingSubsquence)对于一个序列3,2,6,4,5,1,它包含很多递增子序列3,6,2,6,2,4,5,1其中最长的递增子序列是2,4,5 问题:对于长度为N的矢量D,如何找到它的最长递增子序列 一个简单的算法for(i=N;i>0;-... 查看详情

为啥这个除法结果为零?

】为啥这个除法结果为零?【英文标题】:Whydoesthisdivisionresultinzero?为什么这个除法结果为零?【发布时间】:2009-10-1419:06:48【问题描述】:当我遇到以下问题时,我正在用C编写此代码。#include<stdio.h>intmain()inti=2;intj=3;intk,l;f... 查看详情

hdu1087最大递增子段和

http://acm.split.hdu.edu.cn/showproblem.php?pid=1087状态方程:sum[j]=max{sum[i]}+a[j];其中,0<=i<=j,a[i]<a[j] 把当前最大和更新到数组中,注意顺序。 InputInputcontainsmultipletestcases.Eachtestcaseisdescribedi 查看详情

二维数组的查找(代码片段)

...中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 题解:由于二维数组... 查看详情