我正在研究运算符优先级,但我无法理解x
的值2
如何变为y
以及z
和1
的值是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;
}
答案 0 :(得分:4)
++
的优先级高于||
,因此分配的整个RHS归结为x
的增量和对真值(1)的评估。
z = ++x || ++y&&++z;
truthy (1) never executed
这是因为++x
的计算结果为true,而第二个分支未执行。 ++x
是2
,在布尔上下文中,它的计算结果为true或1
。 z
取1
的值,为您提供观察到的最终状态。
答案 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
,因此语句++x
为true
。因此,未执行进一步的条件++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
。