初来乍到,先拜个山头!
小生初来宝地,没什么拜见各位大侠,先写几个好玩的例子耍耍。这些例子的代码是很危险的,根本原因是:C++对子表达式的求值顺序没有定义,这使得一些表达式的结果取决于具体的C++实现(编译器)。我只写了几个,欢迎大侠补充。例子一:
int x = f()+g();
这里不能假定f()和g()哪个先调用,有的编译器会先调用g()。
例子二:
int i = 1; a[i] = ++i;
这里不能假定结果是a[1]=2。有的编译器先对子表达式:++i求值,那就是a[2]=2。
例子三:
int s = 5; int x = (s + 1) * (++s);
这里不能假定结果是x=6*6=36。有的编译器先对子表达式:++s求值,那就是x=7*6=42。
例子四:
int i=1; int x = i+1==++i ? 1 : 0;
这里x的值是1还是0,取决于子表达式i+1和++i哪个先求值。要是先对子表达式:++i求值,那x的值是0,要是先对i+1求值,那x的值就是1。
例子五:
int a[] = {1, 2}; int i = 0; int x = a[i] << ++i;
这里x的值是什么?根据先对a[i]求值还是先对++i求值,可能是2,可能是4。
但是,逗号(,)表达式是从左到右求值的。比如:
i=0,i+=1,i*=2;
结果是:
i=2;
[此贴子已经被作者于2023-4-17 07:38编辑过]