C 描述以下代码

C 描述以下代码,c,C,我有一个关于我被分配的任务的问题 -有两个整数,a和b,其值分别为-1和1。 运行以下代码后,a和b的值是多少?为什么 if(!++a) b+=a++; 当我运行这段代码时,我得到了值1和1。我真的不明白为什么。。。我对if语句感到非常困惑,有人能为一个试图学习C的初学者解释一下吗?++a给你增量后的值,所以你得到0,这意味着false。运算符使其为真 那么你基本上有 b = b + a; a++; 因此b保持1,而a获得另一个增量,并最终达到1 这里的主要概念是a++和++a之间

我有一个关于我被分配的任务的问题

-有两个整数,
a
b
,其值分别为-1和1。 运行以下代码后,
a
b
的值是多少?为什么

 if(!++a)

   b+=a++;

当我运行这段代码时,我得到了值1和1。我真的不明白为什么。。。我对if语句感到非常困惑,有人能为一个试图学习C的初学者解释一下吗?

++a
给你增量后的值,所以你得到
0
,这意味着false。
运算符使其
为真

那么你基本上有

b = b + a;
a++;
因此
b
保持
1
,而
a
获得另一个增量,并最终达到
1


这里的主要概念是
a++
++a
之间的区别。如果您使用
a++
您将首先获得
a的值,然后该值将递增,而
++a
的值将首先递增,然后返回。

您的代码与此代码等效:

int a = -1;
int b = 1;

a += 1;
if (a == 0) {
    b += a;
    a += 1;
}

你应该明白为什么这两个变量在这里都是1。现在试着弄清楚为什么这些代码是等价的。

当您的代码输入if(!+++a)时,最初的a=-1,并且是预增量,a的第一个增量将发生,因此a将变为0和!0是1,它将进入if块

现在b++=a++; 这里a++是后增量,所以您可以将该语句分为两部分

第一b+=a;b+=0,因此b将保持为1

二是a++;a将变成1

if (!++a)
首先,
if(a)
if(a!=0)
相同。奇怪,但却是真的。零表示假,其他数字表示真

如果(!a)
,意思就颠倒了

++a
递增
a
并返回新值。(与
a++
不同,后者增加
a
,但返回旧值,而不是新值。)

把所有这些放在一起,这表示“增量
a
,并测试答案是否为零”。如果
a=-1
,那么这确实是真的

通常,如果(…){do stuff}
,人们会编写
,但如果“do stuff”部分只是一条语句,则可以省略括号。我们已经确定该条件在本例中为true,因此运行“b++=a++”行

如果我们在上面加上一些空格,我们就有了

b += (a++);

所以,再次递增
a
,但在此之前,在运行此代码时,将它的(旧)值添加到
b

@Vladp“…此外,@OP:给自己买一本好的C语言书。答案实在微不足道<代码>
是一个逻辑NOT运算符,
++a
a++
都会减少
a
的值,分别产生已经增加的值和原始(尚未增加的)值。这个问题似乎离题了,因为它对所使用的语言甚至缺乏起码的理解。