假设存在一些情况,您希望在同一个for循环中递增和递减值.在这种情况下,在某些情况下,您可以通过利用情况的性质来"欺骗"这种情况 - 例如,反转字符串.
由于构建字符串的性质,我们实际上不必操纵迭代或添加额外的计数器:
public static void stringReversal(){
String str = "Banana";
String forwardStr = new String();
String backwardStr = new String();
for(int i = str.length()-1; i >= 0; i--){
forwardStr = str.charAt(i)+forwardStr;
backwardStr = backwardStr+str.charAt(i);
}
System.out.println("Forward String: "+forwardStr);
System.out.println("Backward String: "+backwardStr);
}
Run Code Online (Sandbox Code Playgroud)
但是,假设存在一种不同的情况,我们只想打印一个递减值,从初始值到0,以及一个递增的值,从0到初始值.
public static void incrementAndDecrement(){
int counter = 0;
for(int i = 10; i >= 0; i--){
System.out.println(i);
System.out.println(counter);
counter++;
}
}
Run Code Online (Sandbox Code Playgroud)
这种方法效果很好,但是必须创建第二个增量计数器似乎很麻烦.是否有任何涉及for循环的数学技巧或技巧可能会使counter多余?
我是第一次学习PHP,我发现该语言允许在字符串上使用递增运算符,这令人惊讶.
$foo = 'xyZ';
print ++$foo; // prints xzA
Run Code Online (Sandbox Code Playgroud)
我可以在这个主题周围找到的教程仅介绍玩具示例. 如果您提到使用此"功能"有益的情况,我将不胜感激.
提前致谢!
我已完成搜索,但我发现与查询无关.我目前正在调试C优化器,有问题的代码如下所示:
while( x-- )
array[x] = NULL;
Run Code Online (Sandbox Code Playgroud)
在这种情况下会发生什么?并且这个逻辑的结果是否应该在所有编译器中保持一致?
让我们说在这种情况下x的初始值是5.
问题是程序崩溃,我的理解是它是由负数组元素引用引起的.
任何帮助,将不胜感激.
如果我从Crockford的"Javascript:The Good Parts"中正确回忆起来,他并不赞成使用++或 - 运算符,但我也倾向于回忆他并没有提供一个特别强烈的反对它们的论据.
下面是这些运算符的使用,我发现这些运算符有助于保持我的代码尽可能简洁,特别是在处理返回-1的函数/方法时,0是第一个可能的有效返回值(以及正整数).我会对++和/或其他非典型用法感兴趣,这些用法有利于在有意义的情况下使用这些运算符.
我不认为这是为什么要避免JavaScript中的增量("++")和减量(" - ")运算符?而是它的必然结果:何时不能避免它们,而是将它们用于你的优势.当然我可能会弄错,可能有一些原因我不会想到为什么以下是充满危险的,尽管我觉得我很优雅 - 如果我遗漏了以下关于以下内容的次优,我我也想知道
var substrIdx = str.indexOf(substr);
if (++substrIdx) {
doSomething(--substrIdx);
}
Run Code Online (Sandbox Code Playgroud) 简单的问题,虽然我不确定是否有答案.我正在处理一个可以是正数或负数的整数.
但是,我想根据符号增加或减少它.
例如,如果它是"2",则添加1并使其为"3".
如果它是"-2",则减去1并使其为"-3".
我已经知道通过添加if语句并有两个单独的递增和递减部分来解决这个问题的明显方法.但是,我试图限制我使用的代码量,并且想知道是否有类似的方法从内置函数或过程执行此操作.
递增并回零很容易:
i = (i + 1) % Max;
Run Code Online (Sandbox Code Playgroud)
但递减并不是那么简单。基本上,要递减并换行,您通常会找到如下代码:
i--;
if (i < 0)
i = Max;
Run Code Online (Sandbox Code Playgroud)
如果不使用 if 语句,我们如何编写前面的代码呢?
我知道可能会涉及按位运算符。通常,当我遇到此类问题时,我会尝试提出一些包含两项 A 和 B 的方程,然后尝试找到这两项的实际值。例如:
i = A + B
Run Code Online (Sandbox Code Playgroud)
如果i在范围内]0, Max]那么我们会得到:
i = 0 + B和B = i-1
否则如果i == 0:
i = A + 0和A = Max
同样我们可以写:
i = i == 0 ? Max : i - 1;
Run Code Online (Sandbox Code Playgroud)
如何在没有任何 if 或三元运算符的情况下编写前面的方程?我尝试了很多按位运算和不同的算术组合,但没有成功。
有任何想法吗?
我有这个功能:
void m(int n)
{
if(n > 0)
m(--n);
cout << n << " "; //for n = 5 --> output is: 0 0 1 2 3 4
}
Run Code Online (Sandbox Code Playgroud)
我有一个问题,了解它是如何工作的.例如:
n(输入)= 5
输出:0 0 1 2 3 4
我的问题是:为什么它显示零两次?
当我添加这样的括号:
void m(int n)
{
if(n > 0)
{
m(--n);
cout << n << " "; // now, it shows 0 1 2 3 4 (n = 5)
}
}
Run Code Online (Sandbox Code Playgroud)
那么,在这段代码中括号是什么,"0"只存在一次?
当我将预减量(--n)改为后减量(n--)时,它什么也没有显示.为什么?
有人可以帮我理解它是如何工作的吗?
我创建了两个递归方法来计算阶乘,如下所示:
private int fact1(int n) {
if (n == 0 || n == 1)
return 1;
return n * fact1(--n);
}
private int fact2(int n) {
if (n == 0 || n == 1)
return 1;
return fact2(--n) * n;
}
Run Code Online (Sandbox Code Playgroud)
当我打电话给fact1(4)它返回24.当我调用fact2(4)它返回时6(编辑:没有返回18但是6).我知道第二种方法是制作3*2*1,但我不明白为什么不是4*3*2*1.
如果我将返回更改为,则会发生相同的情况
//fact3(4) returns 60.
return (n + 1) * fact3(--n); // wrong
//fact4(4) returns 24
return fact4(--n) * (n + 1); // works
Run Code Online (Sandbox Code Playgroud)
为什么该方法表现出这种行为? …
有人可以让我知道我哪里出错了吗?当我运行代码时,我得到 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 10. 我如何让循环在 0 处停止?当我删除最后一行代码 (console.log(countDown);) 时,循环在 0 处结束,但挑战未完成。任何帮助是极大的赞赏!
使用 for 循环,每次循环运行时将 countDown 减一,直到它等于 0,利用循环功能而不是单独记录每个数字。
let countDown = 10;
// ADD CODE HERE
for (let countDown = 10; countDown>0;countDown--)
{
console.log(countDown);
}
// Uncomment the below line to check your work
console.log(countDown) // -> should print 0;
Run Code Online (Sandbox Code Playgroud) 这个问题是关于\xd0\xa1的。假设我们有这样的代码:
\nbool a = false;\na++;\nprintf("%d\\n", a);\na--;\nprintf("%d\\n", a);\nRun Code Online (Sandbox Code Playgroud)\n在我的 x86-64 linux 机器上显示:
\n1\n0\nRun Code Online (Sandbox Code Playgroud)\n这对我来说并不意外。这段代码:
\nbool a = false;\na++; a++;\nprintf("%d\\n", a);\na--; a--;\nprintf("%d\\n", a);\nRun Code Online (Sandbox Code Playgroud)\n有点令人惊讶,因为它打印了:
\n1\n1\nRun Code Online (Sandbox Code Playgroud)\n这在其他一些架构上是一致的(我检查了x86和arm7)。
\nC 标准规定 e++ 或 e-- 应分别视为 e+=1 或 e-=1。事实上,如果我们替换 a++; 其中a += 1;和一个——;其中a-= 1;输出保持不变。
\n我查看了 x86-64 的程序集。gcc 使用“xor”指令进行减量:
\n b--; b--;\n 11e6: 80 75 ff 01 xor BYTE PTR [rbp-0x1],0x1\n 11ea: 80 75 ff 01 xor BYTE PTR [rbp-0x1],0x1\n printf("%d\\n", b);\n 11ee: 0f b6 45 ff …Run Code Online (Sandbox Code Playgroud)