因此,谷歌快速搜索fflush(stdin)清除输入缓冲区会发现许多网站警告不要使用它.然而,这正是我的CS教授教授课程的原因.
使用有多糟糕fflush(stdin)?即使我的教授正在使用它并且似乎完美无缺地工作,我是否真的应该放弃使用它?
今天我和我的一个朋友进行了讨论,我们就"编译器优化"进行了几个小时的讨论.
我辩护说,有时,编译器优化可能会引入错误或至少是不良行为.
我的朋友完全不同意,他说"编译器是由聪明人构建并做聪明的东西",因此永远不会出错.
他根本没有说服我,但我不得不承认我缺乏现实生活中的例子来强化我的观点.
谁在这?如果是的话,您是否有任何现实生活中的例子,编译器优化会在生成的软件中产生错误?如果我错了,我应该停止编程并学习钓鱼吗?
好吧,我真的不是真的需要这个答案,我只是好奇.
类似*ptr++ = a的表达式是完全有效的,因为我们操作两个对象ptr,*ptr但如果我写*ptr++ = *ptr + a它仍然有效?
例如,请考虑以下代码段:
int main(void){
int a[] = {5,7,8,9,2};
int* p =a;
*p++ = 76; /*altering the first element */
*p++ = *p + 32; /*altering the second element */
p = a;
int i;
for(i = 0;i<5; i++)
printf("%d ",*p++);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我认为表达没有什么可担心的,*p++ = *p + 32;但我不确定所涉及的序列点.
我有一小段C++代码:
#include <array>
#include <string>
#include <iostream>
int main()
{
std::string name = "mario";
std::cerr << "Hello world! " + name + "\n";
std::array<float, 4> arr = {12, 12.3, 13, 14};
std::cerr << "first item is: " + std::to_string(arr.front()) << std::endl;
std::cerr << "last item is: " + std::to_string(arr[-1]) << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它编译并输出以下内容:
work ? c++ -std=c++11 -o hello_world hello.cpp
work ? ./hello_world
Hello world! mario
first item is: 12.000000
last item is: 0.000000
Run Code Online (Sandbox Code Playgroud)
但是,如果我注释掉前两行,如:
#include <array>
#include …Run Code Online (Sandbox Code Playgroud)