【问题标题】:else statement is seemingly ignoredelse 语句似乎被忽略了
【发布时间】:2010-08-28 15:30:07
【问题描述】:
void PacketRecord::determineAppProtocol()
{
    if (ipProtocol == IP_PROTO_UDP)
    {
        std::istringstream ss(udpData);

        std::string line;
        if (getline(ss, line) && (line.find("SIP/2.0") != std::string::npos))
        {
            appProtocol = APP_PROTO_SIP;
        }
        else
        {
            appProtocol == APP_PROTO_RTP;
        }
    }
    else
    {
        appProtocol = APP_PROTO_UNKNOWN;
    }
}

如果内部 if 语句无法评估为 true,我希望执行 else 块(appProtocol 设置为 APP_PROTO_RTP)。但是,这不会发生。相反,似乎 else 语句被完全忽略了。我无法理解为什么会这样。

从我的 gdb 会话中可以看出,if 语句第一次起作用并且 appProtocol 设置为 APP_PROTO_SIP(如预期的那样)。第二次通过,if 失败,但不是进入 else 并将 appProtocol 设置为 APP_PROTO_RTP,而是完全返回函数而不设置 appProtocol。 appProtocol 保持设置为 APP_PROTO_INVALID(它在 PacketRecord ctor 中初始化的值)。

Breakpoint 1, PacketRecord::determineAppProtocol (this=0x805c6c8) at PacketRecord.cpp:156
156     if (ipProtocol == IP_PROTO_UDP)
(gdb) step
158         std::istringstream ss(udpData);
(gdb) 
159         std::string line;
(gdb) 
160         if (getline(ss, line) && (line.find("SIP/2.0") != std::string::npos))
(gdb) 
162             appProtocol = APP_PROTO_SIP;
(gdb) 
167         }
(gdb) 
173 }
(gdb) continue 
Continuing.

Breakpoint 1, PacketRecord::determineAppProtocol (this=0x8065388) at PacketRecord.cpp:156
156     if (ipProtocol == IP_PROTO_UDP)
(gdb) step
158         std::istringstream ss(udpData);
(gdb) 
159         std::string line;
(gdb) 
160         if (getline(ss, line) && (line.find("SIP/2.0") != std::string::npos))
(gdb) 
167         }
(gdb) 
173 }
(gdb) 

【问题讨论】:

  • 打开编译器警告应该为您的语法错误发出“语句无效”警告。如果没有,请获得更好的编译器。从您的 ubuntu 头像来看,g++ -Wall 是您应该始终使用的。
  • @msw:确实。显然,原始代码已粘贴到问题中(应该如此),因为手动复制会隐藏此错误(因为 zobdos 会无意识地输入=,而不是==)。一个(正面)教科书示例,说明为什么您应该始终粘贴代码。

标签: c++ if-statement


【解决方案1】:

你应该替换

appProtocol == APP_PROTO_RTP;

通过

appProtocol = APP_PROTO_RTP;

(没有双等号)

else 语句被执行。但是您没有将值分配给其中的 appProtocol。

【讨论】:

  • +1 这个语句肯定会在代码之外进行优化,连同包含的分支一起。
  • 对。对于此类问题,应该使用打印而不是调试器。一个简单的cout << appProtocol << endl; 就会显示问题。
  • 一个好的编译器也可以警告诸如此类的错误(“语句无效”)。它有助于打开(和高)警告。
  • @UncleBens:好建议。我将 -Wall 添加到我的 makefile 并得到: PacketRecord.cpp: In member function 'void PacketRecord::determineAppProtocol()': PacketRecord.cpp:166: warning: statement has no effect 从现在开始始终使用 -Wall。 :)
【解决方案2】:

您不是在分配,而是在比较。使用=,而不是==

【讨论】:

    【解决方案3】:

    你在这里使用了一个等式声明:

     appProtocol == APP_PROTO_RTP;
    

    而不是分配。

    正确的代码是:

    appProtocol = APP_PROTO_RTP;
    

    【讨论】:

      猜你喜欢
      • 2021-10-28
      • 2016-09-30
      • 2012-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-15
      • 2017-12-05
      • 2012-03-08
      相关资源
      最近更新 更多