C 为什么这个if语句需要括号?
通常,如果在C 为什么这个if语句需要括号?,c,if-statement,C,If Statement,通常,如果在if语句后面加上一条语句,则不需要括号。例如: if (condition) statement1; statement2; 语句2在任何情况下都将运行。但这在这里不会发生: for (j = 0; j < size; j++) { if (size % 2) if (j % 2) *(minmat + j) *= -1.0; else { … } } 但是,为什么会发生这种情况呢?在第一种情况下,“暗示”第二个if语
if
语句后面加上一条语句,则不需要括号。例如:
if (condition) statement1; statement2;
语句2
在任何情况下都将运行。但这在这里不会发生:
for (j = 0; j < size; j++) {
if (size % 2) if (j % 2) *(minmat + j) *= -1.0;
else {
…
}
}
但是,为什么会发生这种情况呢?在第一种情况下,“暗示”第二个if
语句在括号内?来自C99标准:
6.8.4.1 if语句
3如果语法允许,则else
与词汇上最近的前一个if
关联
因此,
if(size%2) if(j%2) *(minmat+j) *= -1.0;
else {
.
.
.
}
相当于:
if(size%2)
{
if(j%2) *(minmat+j) *= -1.0;
else {
.
.
.
}
}
if(size%2)
{
if(j%2) {
*(minmat+j) *= -1.0;
}
else {
.
.
.
}
}
这相当于:
if(size%2)
{
if(j%2) *(minmat+j) *= -1.0;
else {
.
.
.
}
}
if(size%2)
{
if(j%2) {
*(minmat+j) *= -1.0;
}
else {
.
.
.
}
}
不确定您为什么认为“隐含”括号存在,或者是否适用于此处。正确缩进后,您已写入:
for(j=0; j<size; j++{
if(size%2)
if(j%2)
*(minmat+j) *= -1.0;
else {
}
}
用于(j=0;j这种模糊性被称为问题。不管你凭直觉会发现什么,语言设计者已经做出决定,将else
与最接近的if
相关联。如果我仔细想想,我觉得这个决定很自然,但这是有争议的。不可争议的是,一个决定h它是一个运算符,它比一个if
if到另一个if的if更粘,因此它“粘”到最近的if,就像乘法在加法之前一样
这是一条有意义的规则,因为没有括号的其他嵌套if将出现问题。else语句将与最近的if关联。您也可以这样更正它:
for(j=0; j<size; j++{
if(size%2) if(j%2) *(minmat+j) *= -1.0; else;
else {
.
.
.
}
}
for(j=0;jC11标准草案,第6.8.4.1节§3:如果语法允许,则else与词汇上最接近的前导相关联。
else与第一个不关联,如果只是因为缩进提示它。不是MISRA-C的粉丝,而是MISRA-C总是要求{
用于if
语句(所以即使里面只有一条语句)。