帮大家避一个大坑

学术版

bryce @ 2024-11-29 09:56:04

#include<iostream>

using namespace std;

int a;
void solve(int x, int y){
    cout << x << ' ' << y << '\n';
}

int main(){
    solve(++a, ++a);
    return 0;
}

如上代码中,输出为 2 1,而不是 1 2,由此可知,传参是有顺序的,所以在使用快读时,最好不要用 read() 直接传参,用一个变量储存后再传参,如下:

正确示例:

int l = read(), r = read();
solve(l, r);

错误示例:

solve(read(), read());

by qazsedcrfvgyhnujijn @ 2024-11-29 10:03:35

补充一下:可能与编译器有关,(看网上的博文说)clang的计算顺序是从左至右,而VS的计算顺序是从右至左。我自己测的 G++ 是从右往左的,有能力的谷民可以测一下其他的编译器。


by Magallan_forever @ 2024-11-29 10:09:03

所以代码不要写得太跳了

好冷的知识(:з」∠)


by Disjoint_cat @ 2024-11-29 10:11:57

这不是经典 UB 么?


by CJ_Fu @ 2024-11-29 10:15:54


by ImposterAnYu @ 2024-11-29 10:18:29


by liyixin0514 @ 2024-11-29 10:22:08

这是经典的 UB。


by liyixin0514 @ 2024-11-29 10:22:24

感谢提醒/bx


by Vector_Li @ 2024-11-29 10:24:18

++a 确实没有什么研究必要,多写几行不会有坏处的


|