C++:'cout << pointer << ++ pointer'生成编译器警告

K.F*_*K.F 7 c++ cout compiler-warnings

我在这里有一个C++学习演示:

char c = 'M';
short s = 10;
long l = 1002;
char * cptr = &c;
short * sptr = &s;
long * lptr = &l;
cout << "cptr:\t" << static_cast<void*>(cptr) << '\n';
cout << "cptr++:\t" << static_cast<void*>(++cptr) << '\n';
cout << "sptr:\t" << sptr << '\n';
cout << "sptr++:\t" << ++sptr << '\n';
cout << "lptr:\t" << lptr << '\n';
cout << "lptr++:\t" << ++lptr << '\n';

cout << c << '\t' << static_cast<void*>(cptr) << '\t' << static_cast<void*>(++cptr) << '\n';
cout << s << '\t' << sptr << '\t' << ++sptr << '\n';
cout<< l << '\t' << lptr << '\t'<< ++lptr << '\n';
Run Code Online (Sandbox Code Playgroud)

编译器警告:

图片

任何人都可以向我解释这个吗?怎么解决?

M.M*_*M.M 9

从C++ 17开始,代码是正确的.

在C++ 17之前,<<链的操作数的评估是无序的,因此代码导致了未定义的行为.

编译器警告表明您没有在C++ 17模式下进行编译.要解决它,您可以:

  • 在C++ 17模式下编译,或
  • <<链分成多个cout <<语句,其中没有x++x在同一语句中.

注意:到目前为止,所有版本的g ++似乎都有漏洞并且没有正确实现这些排序要求,请参阅此主题以获取更多示例.警告可以看作是指示编译器错误; 它们不仅仅是虚假的警告.

  • @sandthorn没有"被标准压制"的东西.该标准允许任何实现以任何理由警告任何代码.诊断质量不会影响一致性.也就是说,如果警告提供的信息不正确,则可能需要将其报告为错误.实现者确实希望提供良好的诊断. (4认同)
  • 同意应报告clang 6和gcc 8.1 -Wall虚假警告的错误 (2认同)

小智 1

您在lines 中有未定义的行为18, 19, 20。根据是否先评估ptr或 ,执行该行的结果会有所不同。++ptr