Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么这个if语句需要括号?_C_If Statement - Fatal编程技术网

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
语句(所以即使里面只有一条语句)。