C中的后增量和前增量运算符

Posted

技术标签:

【中文标题】C中的后增量和前增量运算符【英文标题】:Post-increment and pre-increment operator in C [duplicate] 【发布时间】:2012-10-17 11:05:09 【问题描述】:

为什么 k 没有递增,而 i 和 j 在同一个表达式中递增。我还想知道程序的输出是什么。我得到的输出为 -2 3 1 0

#include <stdio.h>
void main()

 int i=-3, j=2, m, k=0;
 m=++i && ++j || ++k;
 printf("%d %d %d %d", i, j, m, k);

【问题讨论】:

【参考方案1】:

逻辑或,|| 短路,然后

++i && ++j

整个表达式的值已确定,因此|| 的右操作数不会被计算。

m=++i && ++j || ++k;

用括号括起来m = (++i &amp;&amp; ++j) || ++k;,因为&amp;&amp; 的优先级高于||

逻辑运算符的短路意味着仅在左侧的评估尚未确定最终结果时才评估右侧操作数,对于||,这意味着仅在左侧评估为时才评估右侧操作数0,对于&amp;&amp;,仅当左侧计算为非零值时才计算右侧操作数。

所以首先评估++i &amp;&amp; ++j,为此,首先评估++ii 之前有 -3 的值,所以 ++i 计算为 -2,它不是 0,因此 ++j 也被计算。 j 之前的值是 2,因此 ++j 的计算结果为 3,这又是非零值,因此 ++i &amp;&amp; ++j 的计算结果为 1(真)。由于||的左操作数不为零,其结果已经确定(为1),并且右操作数未计算,因此k保持不变,m设置为1。

【讨论】:

【参考方案2】:

如果|| 条件左侧的项目评估为真,则评估右侧没有意义,因为 OR 条件已经满足。这就是++k 未被评估的原因

【讨论】:

【参考方案3】:

这些运算符被称为短路运算符。因此,如果表达式++i &amp;&amp; ++j 为真,则它不会计算k(无论k 的值如何,我们都知道表达式的值)。

【讨论】:

【参考方案4】:

这与顺序优先级有关。任何时候执行逻辑或,如果第一个操作数为真,它就会停止,在这种情况下是 j。

【讨论】:

【参考方案5】:

逻辑运算符|| 的工作原理如下:如果第一个条件为真,则不计算第二个条件。

所以首先(++i &amp;&amp; ++j) 检查。它返回 true,因此在它之后 || 不会被评估。因此,k 的值不会增加。

【讨论】:

【参考方案6】:
#include<stdio.h>
int add(int);
void main()
 
    int i=3,k,l;
    clrscr();
    k= add(++i);
    l=add(i++);
    printf("i=%d k= %d  l=%d",i,k,l);
     getch();
 
 int add(int ii)
  
   ++ii;
   return(ii);
 

/*th eoutput is 
5    
5
5     can anyone expalin how? */

【讨论】:

【参考方案7】:

#include"stdio.h"

#include"conio.h"

main()

int rmv=10,vivek=10;

clrscr();

rmv++;//本帖增量表示下一步增量10+1

//rmv+1和rmv++都是一样的

printf("1.rmv++=%d\n",rmv);//值为10

printf("2.rmv++=%d\n",rmv++);//值为增量11

++vivek;//这个预加的意思是先加值所以,1+10=11

printf("1.\t++vivek=%d\n",vivek);////++vivek 和 1+vivek 都是一样的

printf("2.\t ++vivek=%d",++vivek");

get();

【讨论】:

前增量是第一个增量值(++rmvivek),后增量是下一步增量值(rmvivek++)

以上是关于C中的后增量和前增量运算符的主要内容,如果未能解决你的问题,请参考以下文章

Java中的字符不会随后增量更新[重复]

C和JAVA中增量-减量运算符的差异[重复]

C# 增量运算符 (++) 问题:为啥我得到错误的输出?

关于 Java 8(OCA)中的短路运算符和后缀增量的问题 [关闭]

使用增量和减量运算符进行加法和减法。 C++

为啥后增量运算符返回 NaN? [关闭]