C 你认为这种糟糕的编码风格吗?
我今天看到了这个代码:C 你认为这种糟糕的编码风格吗?,c,coding-style,C,Coding Style,我今天看到了这个代码: if(++counter == 10) { //Do Something foo(); } 我认为这是一种糟糕的风格,但是,执行编译器是否也依赖于它呢?假设在我们到达这一行之前,计数器被设置为8,它将增加它,然后比较10到8,之前的值,或者比较10到9,计数器增加后的值 你怎么看?这是惯例吗?糟糕的风格 此代码的行为与编译器无关(除了可能的溢出行为)。它是否是一种好的风格是个人喜好的问题。我通常避免对条件句进行修改,但有时它会很有用,甚至很优雅 此代码保证将
if(++counter == 10)
{
//Do Something
foo();
}
我认为这是一种糟糕的风格,但是,执行编译器是否也依赖于它呢?假设在我们到达这一行之前,计数器被设置为8,它将增加它,然后比较10到8,之前的值,或者比较10到9,计数器增加后的值
你怎么看?这是惯例吗?糟糕的风格 此代码的行为与编译器无关(除了可能的溢出行为)。它是否是一种好的风格是个人喜好的问题。我通常避免对条件句进行修改,但有时它会很有用,甚至很优雅 此代码保证将新值与10进行比较(即,在您的示例中,9与10进行比较)。从形式上讲,说比较发生在
计数器
递增之后是不正确的。这里没有“之前”或“之后”。即使在将新值实际放入计数器之前,也可以对其进行预计算并与10进行比较
换句话说,++计数器==10
的计算可以按如下方式进行
counter = counter + 1
result = (counter == 10)
或作为
请注意,在第一种情况下,计数器
在比较之前递增,而在第二种情况下,它在比较之后递增。这两种情况都是有效的,在实践中是完全可能的。这两种情况都会产生语言规范所要求的相同结果。此代码的行为与编译器无关(除了可能的溢出行为)。它是否是一种好的风格是个人喜好的问题。我通常避免对条件句进行修改,但有时它会很有用,甚至很优雅
此代码保证将新值与10进行比较(即,在您的示例中,9与10进行比较)。从形式上讲,说比较发生在计数器
递增之后是不正确的。这里没有“之前”或“之后”。即使在将新值实际放入计数器之前,也可以对其进行预计算并与10进行比较
换句话说,++计数器==10
的计算可以按如下方式进行
counter = counter + 1
result = (counter == 10)
或作为
请注意,在第一种情况下,计数器
在比较之前递增,而在第二种情况下,它在比较之后递增。这两种情况都是有效的,在实践中是完全可能的。这两种情况都会产生语言规范所要求的相同结果。运算符优先级始终会导致增量在比较之前发生。如果您希望使其非常明确,可以使用括号,但我不认为这是糟糕的编码风格。运算符优先级将始终导致增量在比较之前发生。如果您想让这一点非常明确,可以使用括号,但我不认为这是一种糟糕的编码风格。就我个人而言,我总是将其分为两条语句
counter++;
if (counter == 10)
DoSomething();
这样你就不需要考虑事情发生的顺序,也就没有混乱的余地了。它对生成的代码没有任何影响,因此,可读性和可维护性问题始终是首要问题。我个人总是将其分为两条语句
counter++;
if (counter == 10)
DoSomething();
这样你就不需要考虑事情发生的顺序,也就没有混乱的余地了。它对生成的代码没有任何影响,在这种情况下,可读性和可维护性问题始终是首要问题。语言标准对它进行了很好的定义,它是否是一种糟糕的样式是个人喜好的问题,也是上下文的问题。我有一个使用类似条件的函数,我认为它看起来和工作起来都很好,我认为当从条件中取出增量时,它的可读性会降低
const char *GetStat(int statId)
{
int id = 0;
if (statId==id++)
{
return "Buffers";
}
else if (statId==id++)
{
return "VBuffers";
}
#ifndef _XBOX
else if (statId==id++)
{
return "Reset factor";
}
#endif
else if (statId==id++)
{
return "CB Mem";
}
return "";
}
注意:这里的增量实际上根本没有“执行”,一个好的编译器会将++done on id变量消除为常量。语言标准对其进行了很好的定义,它是否是一种糟糕的样式取决于个人偏好,也取决于上下文。我有一个使用类似条件的函数,我认为它看起来和工作起来都很好,我认为当从条件中取出增量时,它的可读性会降低
const char *GetStat(int statId)
{
int id = 0;
if (statId==id++)
{
return "Buffers";
}
else if (statId==id++)
{
return "VBuffers";
}
#ifndef _XBOX
else if (statId==id++)
{
return "Reset factor";
}
#endif
else if (statId==id++)
{
return "CB Mem";
}
return "";
}
注意:这里的增量实际上根本没有“执行”,一个好的编译器会将++done on id变量消除为常量。这是一种不常见且糟糕的样式,但其含义是精确的,不依赖于编译器。这是一种不常见且糟糕的样式,但它的含义是精确的,不依赖于编译器。我不知道它是否是一种糟糕的编码风格,但它有点令人困惑。我的意思是,当你第一次看到它时,你会在心里问自己,++
是否有问题。我不知道它是否是一种糟糕的编码风格,但它有点让人困惑。我的意思是,当你第一次看到它时,你会在心里问自己,++
是否有问题。