if子句中没有括号的多行代码块的奇怪行为

时间:2012-02-03 08:11:51

标签: c++

当我编译以下代码片段并运行它时,我希望它在第一行打印语句。 12也是。但那不会发生吗?为什么会这样?编译器如何处理if块中的注释?

  1 #include <iostream>
  2 using namespace std;
  3
  4 int main() {
  5     int a;
  6     if (false)
  7         cout << "This will not be printed." << endl;
  8         cout << "This will be printed anyway." << endl;
  9
 10     if (false)
 11         // comment
 12         cout << "This should also be printed. But not. Why?" << endl;
 13         a = 100;
 14
 15     cout << "a = " << a << endl;
 16 }

产生

hyper150:~ 1041$ g++ what_if.cpp
hyper150:~ 1042$ ./a.out
This will be printed anyway.
a = 100

7 个答案:

答案 0 :(得分:4)

在制作的母语代码中没有任何评论痕迹。

您的代码与此相同:

  1 #include <iostream>
  2 using namespace std;
  3
  4 int main() {
  5     int a;
  6     if (false)
  7         cout << "This will not be printed." << endl;
  8         cout << "This will be printed anyway." << endl;
  9
 10     if (false)
 11         cout << "This should also be printed. But not. Why?" << endl;
 12         a = 100;
 13
 14     cout << "a = " << a << endl;
 15 }

由于第10行[新代码]的条件从未得到满足 - 第11行的cout从未发生

答案 1 :(得分:1)

它没有打印,因为你前面有if(false)if (false)永远不会评估为真。

答案 2 :(得分:1)

编译器会忽略评论。

还有一个建议:在if这样的语句中,即使只有一个语句,你写大括号也会更好。

if (false)
    cout << "This should also be printed. But not. Why?" << endl;

写得更好:

if (false)
{
    cout << "This should also be printed. But not. Why?" << endl;
    // Most likely you are going to add more statements here...
}

答案 3 :(得分:0)

如果您不使用括号,if将仅采用下一个表达式:

if (false)
cout << "This will not be printed." << endl;
cout << "This will be printed anyway." << endl;

if (false)
// comment
cout << "This should also be printed. But not. Why?" << endl;
a = 100;

相当于:

if (false)
{
   cout << "This will not be printed." << endl;
}
cout << "This will be printed anyway." << endl;

if (false)
{
   // comment
   cout << "This should also be printed. But not. Why?" << endl;
}
a = 100;

在实际编译之前很久就删除了注释。

答案 4 :(得分:0)

如果你不使用大括号来包围条件结果,那么条件结果将以下一个语句的结尾终止,这通常意味着;字符。

但它不仅仅是;角色,因为你可以这样做(这真是太可怕了):

if (true)
   for(int i = 0; i < 5; i++)
      if (i == 4)
         break;
      else
         h = i;

在这种情况下,for循环是下一个发生的语句,它是一个在h = i语句之后终止的迭代语句。

每个人都有自己的括号约定 - 我更喜欢只使用无括号if语句,如果只有一行不需要注释(如果有else语句,那么我使用括号)。

答案 5 :(得分:0)

代码优化是编译的一个阶段。在此期间,您的注释代码将从实际生成二进制文件的代码中删除。所以它把它解释为

if (false)
   cout << "This should also be printed. But not. Why?" << endl;

你在if条件下放了一个假的......你知道后果。

答案 6 :(得分:0)

行结尾在C ++中并不重要; if控制以下内容 声明。在第二种情况下,以下语句是输出, 所以不应该打印。评论不是陈述(一个是在 在实际解析之前用白色空格替换了事实。因此:

if ( false ) std::cout << "no" << std::endl;

if ( false )
    std::cout << "no" << std::endl;

if ( false )


    std::cout << "no" << std::endl;

不会输出任何内容。