gpt4 book ai didi

c - C中的+(+ k--)表达式

转载 作者:行者123 更新时间:2023-12-02 18:34:54 26 4
gpt4 key购买 nike

我在测试中看到了这个问题,在测试中我们必须告诉以下代码输出。

#include<stdio.h>

int main(){
int k = 0;
while(+(+k--)!=0)
k=k++;
printf("%d\n", k);
return 0;
}


输出为 -1。我不确定为什么会这样。

表达式 +(+k--)在C中是什么意思?

最佳答案

[为了记录,自从被接受并投票以来,我已经对该答案进行了相当大的编辑。不过,它仍然说基本相同的内容。]

这段代码深深地,有意地使人困惑。它包含一个可怕的未定义行为的狭窄实例。基本上不可能确定提出这个问题的人是非常,非常聪明还是非常,非常愚蠢。而且此代码可能声称要教给或测验您的“教训”,即一元加号运算符没有做太多事情,当然还不足以应对这种颠覆性的误导。

该代码有两个令人困惑的方面,一个奇怪的条件:

while(+(+k--)!=0)


以及它控制的痴呆语句:

k=k++;


我将首先介绍第二部分。

如果您有一个像 k这样的变量想要加1,C不会给您一个,两个,三个或四个不同的方法:


k = k + 1
k += 1
++k
k++


尽管有这么多赏金(或也许是因为赏金),但一些程序员还是感到困惑和咳嗽,

k = k++;


如果您不知道该怎么办,请不要担心:没有人可以。该表达式包含两种不同的尝试来更改 k的值( k =部分和 k++部分),并且由于C中没有规则说哪个尝试的修改“胜出”,所以类似这在形式上是未定义的,不仅意味着它没有定义的含义,而且包含它的整个程序都是可疑的。

现在,如果您非常仔细地看,您会发现在此特定程序中,实际上未执行行 k = k++,因为(正如我们将要看到的)控制条件最初是假的,因此循环运行0次。因此,该特定程序实际上可能未定义-但在病理上仍然令人困惑。

有关此类不确定行为的所有问题,另请参见 these canonical SO answers

但是您没有询问 k=k++部分。您询问了第一个令人困惑的部分,即 +(+k--)!=0条件。这看起来很奇怪,因为很奇怪。没有人会在真正的程序中编写过这样的代码。因此,没有理由学习如何理解它。 (是的,确实如此,探索系统的边界可以帮助您了解系统的优点,但是我的书在富有想象力的,发人深省的探索与笨拙的滥用探索之间有着清晰的界限,这种表达方式非常清晰该行的错误一侧。)

无论如何,让我们检查 +(+k--)!=0。 (然后,让我们忘记所有这些。)必须从内而外地理解任何这样的表达式。我想你知道

k--


做。它使用 k的当前值并将其“返回”到表达式的其余部分,并且它或多或少同时递减 k,即,将数量 k-1存储回 k

但是 +会做什么?这是一元加号,而不是二进制加号。就像一元减。您知道二进制减号会减去:

a - b


从a减去b。而且您知道一元减法会否定事物:

-a


给你a的负数。一元 +所做的基本上是什么。在将正值更改为正值并将负值更改为负值后, +a为您提供 a的值。所以表达

+k--


给您 k--给您的任何东西,即 k的旧值。

但是我们还没有完成,因为我们有

+(+k--)


这只需要 +k--给您的所有内容,然后再对它应用一元 +。因此,它为您提供了 +k--给您的一切,这正是 k--给您的一切,这是 k的旧值。

所以最后,条件

while(+(+k--)!=0)


与更普通的情况完全一样

while(k-- != 0)


会做。 (它的作用与看上去更复杂的条件 while(+(+(+(+k--)))!=0)一样。并且括号实际上不是必需的;它也与 while(+ + + +k--!=0)一样。)

甚至弄清楚什么是“正常”情况

while(k-- != 0)


确实有点棘手。此循环中发生了两件事:由于循环可能多次运行,我们将执行以下操作:


继续做 k--,使 k越来越小,而且
继续做循环的主体,无论做什么。


但是,在决定是否再次进行循环之前(或过程中),我们立即进行 k--部分。请记住, k--在递减之前会“返回” k的旧值。在此程序中, k的初始值为0。因此, k--将“返回”旧值0,然后将 k更新为-1。但是剩下的条件是 != 0-但是,正如我们刚刚看到的,第一次测试条件时,我们得到了0。因此,我们不会在循环中进行任何行程,因此我们不会尝试完全执行有问题的语句 k=k++

换句话说,在这个特定的循环中,尽管我说“正在发生两件事”,但事实证明,事情1发生了一次,而事情2发生了零次。

无论如何,我希望现在已经足够清楚了,为什么这个糟糕的借口最终导致将-1打印为 k的最终值。通常,我不喜欢回答这样的测验问题-感觉像在作弊-但是在这种情况下,由于我非常反对练习的全部内容,因此我不介意。

关于c - C中的+(+ k--)表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58660861/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com