个人感觉c里面奇奇怪怪的规则实在是太多了。特别从c11起骚操作越来越多我个人感觉要想真正学好c,真的是非常费劲接下来我们来看一下c 超级大坑未定义行为是什么又要如何避免这个未定义行为什么是未定义行为代码违反了 C 标准的规定标准对运行结果不做任何承诺——编译器可以让你得到任何结果包括看似正常、崩溃、或者做出完全不合逻辑的事经典例子1——函数参数求值顺序:void f(int a, int b); int i 0; f(i, i); // 未指定行为标准没说i和i谁先求值。可能:先算左边的i(返回 0),再算右边(返回 1)→f(0, 1)先算右边的(返回 0),再算左边(返回 1)→f(1, 0)两种都是合法结果,编译器选哪个都行,不违反标准。这就是未指定。注意:上例严格来说在 C11 后属于UB(未定义行为因为两个i对同一变量无序修改)最可怕的是这种代码运算结果往往是正确的只有极低概率的情况下会运行不到自己想要的结果这种未定义行为还挺多的靠大脑记忆去规避肯定是不行的我们可以在编译的时候添加编译参数让编译器帮我们规避这种有问题的代码void f(int a,int b); int main() { int i 0; f(i,i); return 0; } void f(int a,int b){ }编译指令g -Wall -Wextra -Wsequence-point main2.cpp会报错PS D:\vscodeproject\project1 g -Wall -Wextra -Wsequence-point main2.cpp main2.cpp: In function int main(): main2.cpp:6:12: warning: operation on i may be undefined [-Wsequence-point] 6 | f(i,i); | ~^~ main2.cpp:6:12: warning: operation on i may be undefined [-Wsequence-point] main2.cpp: In function void f(int, int): main2.cpp:10:12: warning: unused parameter a [-Wunused-parameter] 10 | void f(int a,int b){ | ~~~~^ main2.cpp:10:18: warning: unused parameter b [-Wunused-parameter] 10 | void f(int a,int b){经典例子2——同一表达式对一个变量既改变又读取int main() { int i 10; std::cout i i i i std::endl; return 0; }这种代码在c17后是没问题的但是c17前是一种未定义的行为。打印的顺序是可以确保的i和i进入cout的流的顺序的确定的也就是说他们打印出来的前后顺序是确定的但是究竟是先i还是先i是确定不了顺序的使用编译指令g -Wall -Wextra -Wsequence-point main2.cpp报错main2.cpp:9:47: warning: operation on i may be undefined [-Wsequence-point] 9 | std::cout i i i i std::endl;如果使用vscode,在tasks.json加上args即可我这里给出我的完整tasks.json文件{ version: 2.0.0, tasks: [ { type: cppbuild, label: C/C: g.exe build active file, command: C:\\msys64\\ucrt64\\bin\\g.exe, args: [ -fdiagnostics-coloralways, -g, ${fileDirname}\\*.cpp, -o, ${fileDirname}\\${fileBasenameNoExtension}.exe ], //添加这个避免未定义行为 args: [ -fdiagnostics-coloralways, -g, -Wall, -Wextra, -Wsequence-point, ${file}, -o, ${fileDirname}/${fileBasenameNoExtension} ], options: { cwd: ${fileDirname} }, problemMatcher: [$gcc], group: { kind: build, isDefault: true }, detail: compiler: C:\\msys64\\ucrt64\\bin\\g.exe } ] }
阅读完成 · 觉得有帮助?