c++ - 使用 getchar() 和 -O3 的奇怪行为

标签 c++ c getchar

我有这两个功能

    void set_dram_channel_width(int channel_width){
      printf("one\n");
          getchar();
    }


    void set_dram_transaction_granularity(int cacheline_size){
      printf("two\n");
          getchar();
    }
    //output:
    one
    f //my keyboard input
    two
    one
    f  //keyboard input
    two
    one
    f  //keyboard input
    //No more calls

然后我将函数更改为:

    void set_dram_channel_width(int channel_width){
      printf("one\n");
    }


    void set_dram_transaction_granularity(int cacheline_size){
      printf("two\n");
      getchar();
    }
    //output
    one
    two 
    f //keyboard input
    //No more calls 

这两个函数都是由外部代码调用的,两个程序的代码是相同的,只是更改 getchar() 我得到了这两个不同的输出。这是可能的还是我的代码中确实存在错误?

谢谢

这是我用 GDB 得到的输出**

对于第一个代码

(gdb) break mem-dram.c:374
Breakpoint 1 at 0x71c810: file build/ALPHA_FS/mem/dramsim/mem-dram.c, line 374.
(gdb) break mem-dram.c:381
Breakpoint 2 at 0x71c7b0: file build/ALPHA_FS/mem/dramsim/mem-dram.c, line 381.
(gdb) run -d ./tmp/MyBench2/ 
one
f
[Switching to Thread 47368811512112 (LWP 17507)]

Breakpoint 1, set_dram_channel_width (channel_width=64)
(gdb) c
Continuing.
two
one
f

Breakpoint 2, set_dram_transaction_granularity (cacheline_size=64)
(gdb) c
Continuing.

Breakpoint 1, set_dram_channel_width (channel_width=8)
374     void set_dram_channel_width(int channel_width){
(gdb) c
Continuing.
two
one
f

对于第二个代码

(gdb) break mem-dram.c:374
Breakpoint 1 at 0x71c7b6: file build/ALPHA_FS/mem/dramsim/mem-dram.c, line 374.
(gdb) break mem-dram.c:380
Breakpoint 2 at 0x71c7f0: file build/ALPHA_FS/mem/dramsim/mem-dram.c, line 380.
(gdb) run
one
two
f
[Switching to Thread 46985688772912 (LWP 17801)]

Breakpoint 1, set_dram_channel_width (channel_width=64)
(gdb) c
Continuing.

Breakpoint 2, set_dram_transaction_granularity (cacheline_size=64)
(gdb) c
Continuing.

Breakpoint 1, set_dram_channel_width (channel_width=8)
(gdb) c
Continuing.

最佳答案

由于您还没有提供外部代码(还没有?),这里是一个猜测。

while(some condition) {
    foo1();
    foo2();
}
  • foo1 打印“one”然后等待一些输入。您键入“f[enter]”。
  • foo1 使用“f”。
  • foo2 打印“two”然后使用 [enter](换行符)。
  • 然后你回到起点,一切又重演了。

对于您的第二个版本,foo1() 不再读取任何内容。

所以:

  • foo1 打印“one
  • foo2 打印“two”然后等待一些输入。您键入“f[enter]
  • foo2 使用 'f'

唯一剩下的问题是为什么它停止时停止。为了帮助你解决这个问题,我们必须看看 (some condition) 到底是什么。

请注意,在不保留结果的情况下调用 getchar() 是很不寻常的(如 c = getchar();)。你有这样做的理由吗?

一个有用的 C 习语是:

(void) getchar(); 

转换为 void 表明程序员知道他们正在丢弃返回值。

关于c++ - 使用 getchar() 和 -O3 的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/671639/

相关文章:

c++ - 来自变量的 Makefile : select files by extension,

c++ - std::string 的函数指针的 typedef 不起作用

c - 尽管我已经添加了项目,为什么此代码仍然打印 1?

c - 读取用户命令以继续不起作用

c++ - 在抛出 'std::logic_error' what(): basic_string::_M_construct null 的实例后终止调用无效

c - GCC 预处理器将优化什么?

C 数组,我的内存会发生什么

c - 使用 getchar 立即检索击键

C编程从文本中获取文本旁边的数字

c++ - 从命令提示符运行程序并在 C++ 中使用 argv