当前位置: 首页 > 知识库问答 >
问题:

G++错误?(bool_val?0:1)既不返回0也不返回1

呼延哲
2023-03-14

我通过这个简单的演示来再现这个问题:

// bool_test_func.cpp
#include <stdio.h>

void func(bool* b) {
  int a = (*b ? 0 : 1);
  printf("%d\n", a); // EXPECT ether 0 or 1 here
}

// bool_test.cpp
void func(bool* b);

int main() {
  int n = 128;
  func((bool*)&n);
  return 0;
}

-o0编译并运行:

g++ -g -O0 -Wall -o bool_test bool_test.cpp bool_test_func.cpp
mikewei@maclinux:~/testing/c++$ ./bool_test
0
g++ -g -O1 -Wall -o bool_test bool_test.cpp bool_test_func.cpp
mikewei@maclinux:~/testing/c++$ ./bool_test
129

    00000000004005e6 :
      4005e6:       48 83 ec 08             sub    $0x8,%rsp
      4005ea:       0f b6 37                movzbl (%rdi),%esi
      4005ed:       83 f6 01                xor    $0x1,%esi  #just XOR the bool val
      4005f0:       40 0f b6 f6             movzbl %sil,%esi
      4005f4:       bf 94 06 40 00          mov    $0x400694,%edi
      4005f9:       b8 00 00 00 00          mov    $0x0,%eax
      4005fe:       e8 9d fe ff ff          callq  4004a0 
      400603:       48 83 c4 08             add    $0x8,%rsp
      400607:       c3                      retq
      400608:       0f 1f 84 00 00 00 00    nopl   0x0(%rax,%rax,1)
      40060f:       00

 

共有1个答案

夏侯弘量
2023-03-14

我认为这是一个G++的bug。

我不得不恭敬地表示不同意。

如何禁用这种错误的优化?

int a = (*b ? 0 : 1);

但是,由于给出的是128异或结果为129

 类似资料:
  • 出于某种奇怪的原因..返回,而linux中的命令返回 星期日;星期一;星期二;星期三;星期四;星期五;星期六 任何帮助都将不胜感激,谢谢。

  • 查找表示整数为所需的最小位 为什么为值0返回0,难道不应该返回1吗。因为表示0所需的位数是1。 另外,我认为公式中的是一个偏移量

  • 我得到这个错误时,创建新的贝宝通知与活跃的商人 一个OpenSSL::SSL::SSLError发生在payment_notifications#创建:SSL_connect返回=1 errno=0 state=SSLv3读取服务器证书B:证书验证失败 /home/user/.rbenv/versions/2.0.0-p353/lib/ruby/2.0.0/net/http.rb:918:在'连接

  • 问题内容: 我得到imageView的宽度0。下面是代码。 xml文件: 活动内容: 我不想使用下面的代码,因为我需要将此代码放置在很多地方。 我的解决方法: 实际上,我以后不需要在活动中添加此代码。我将其添加到非活动类中,而不是ImageView的宽度,而是使用了位图图像的宽度,现在没有此问题。 问题答案: 您在哪里打电话并在ImageView上打电话?如果您是在活动中打电话,则无法使用。您需要

  • 问题内容: 我知道有很多标题相同的主题。但是大多数情况是将查询插入了错误的位置。但是我认为我说对了。所以问题是,即使将数据插入数据库,我仍然会得到0。有人知道我可能是错的答案吗? 这是我的代码: 在此先多谢一遍,因为我几乎已经整整一天都为此而努力。(可能有点小而愚蠢) 问题答案: 根据手册 mysql_insert_id返回: 成功执行前一个查询为AUTO_INCREMENT列生成的ID; 如果前

  • 问题内容: 我有这个测试表: 使用这三个插入 并发行 但是查询始终会导致。 PHP ,也没有结果。 我整天都在玩弄,无法正常工作。有想法吗? 问题答案: 问题似乎出在MySQL的phpmyadmin配置文件中,每次发出查询时都会生成新的phpmyadmin配置文件- 因此使其无效。 后续主题中的更多信息每个查询都会创建一个新的CONNECTION_ID() 也感谢dnagirl的帮助