【问题标题】:Post-increment and pre-increment operator in C [duplicate]C中的后增量和前增量运算符
【发布时间】: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);
}

【问题讨论】:

    标签: c post-increment pre-increment


    【解决方案1】:

    逻辑或,|| 短路,然后

    ++i && ++j
    

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

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

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

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

    所以首先评估++i &amp;&amp; ++j,为此,首先评估++i。 i 之前有 -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++)
                猜你喜欢
                • 2016-02-02
                • 1970-01-01
                • 2012-06-01
                • 1970-01-01
                • 2011-03-12
                • 2015-08-20
                • 2011-02-16
                • 1970-01-01
                相关资源
                最近更新 更多