C语言中的运算符优先级为z = ++ x || ++ y&& ++ z

时间:2015-06-20 05:46:22

标签: c operator-precedence

我正在研究运算符优先级,但我无法理解x的值2如何变为y以及z1的值是x=y=z=1; z=++x||++y&&++z;

x=2 y=1 z=1

评估为

  public  System.Drawing.Image resizeImage(System.Drawing.Image imgToResize,int Width,int Height)
  {



         int sourceWidth = imgToResize.Width;
        int sourceHeight = imgToResize.Height;

        float nPercent = 0;
        float nPercentW = 0;
        float nPercentH = 0;

        nPercentW = ((float)Width / (float)sourceWidth);
        nPercentH = ((float)Height / (float)sourceHeight);

        if (nPercentH < nPercentW)
            nPercent = nPercentH;
        else
            nPercent = nPercentW;

        int destWidth = (int)(sourceWidth * nPercent);
        int destHeight = (int)(sourceHeight * nPercent);

        Bitmap b = new Bitmap(destWidth, destHeight);
        Graphics g = Graphics.FromImage((System.Drawing.Image)b);
        g.InterpolationMode = InterpolationMode.HighQualityBicubic;

        g.DrawImage(imgToResize, 0, 0, destWidth, destHeight);
        g.Dispose();

        return (System.Drawing.Image)b;
    }

4 个答案:

答案 0 :(得分:4)

++的优先级高于||,因此分配的整个RHS归结为x的增量和对真值(1)的评估。

z = ++x         ||  ++y&&++z;
    truthy (1)     never executed

这是因为++x的计算结果为true,而第二个分支未执行。 ++x2,在布尔上下文中,它的计算结果为true或1z1的值,为您提供观察到的最终状态。

答案 1 :(得分:4)

x=y=z=1
z=++x||++y&&++z

相当于

x=y=z=1
z=((++x)||((++y)&&(++z)));

由于++x返回2,这是非零的,++y && ++z分支永远不会被执行,因此代码相当于:

x=y=z=1;
z=(++x)||(anything here);

答案 2 :(得分:3)

z=++x||++y&&++z;

注意:++的优先级高于||

现在执行此行后,x的值会递增,x=2现在++y&&++z永远不会执行,因为第一个条件为真,因此您获得的值为{{ 1}}

答案 3 :(得分:2)

&&以及 ||操作从左到右执行,而且,在C 0中表示false和任何非零值表示true。你写了

x=y=z=1;
z= ++x || ++y && ++z;

作为x = 1,因此语句++xtrue。因此,未执行进一步的条件++y && ++z

因此输出变为:

x=2 // x incremented by 1
y=1 // as it is
z=1 // assigned to true (default true = 1)

现在尝试一下,

z= ++y && ++z || ++x ;

你会得到

x=1 // as it is because ++y && ++z are both true 
y=2 // y incremented by 1
z=1 // although z incremented by 1 but assigned to true (default true = 1)

最后试试这个:

int x = 1;
int y = 0;
int z = 1;

z= y && ++z || ++x;

输出将是:

因此输出变为:

x=2 
y=0 
z=0 

因为,现在z的语句如下所示:

z = false (as y =0) && not executed || true
z = false || true
z = true

因此,y保持不变,x增加并变为2,最后z分配给true