关键词:
【中文标题】为啥 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 查看详情
二维数组的查找(代码片段)
...中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 题解:由于二维数组... 查看详情