And*_*eas 1 c undefined-behavior
这是Deep C的一个例子(幻灯片194)
int a = 41;
a++ & printf("%d\n", a);
Run Code Online (Sandbox Code Playgroud)
该演示文稿声称结果未定义.为什么?a仅在序列点之间分配一次.我认为a++和之间的执行顺序printf是未指定的,因此这将在所有符合要求的编译器上打印41或42,没有未定义的行为.
在这一行中 - a++ & printf("%d\n", a);只有一个序列点(不计算函数参数中a++1发生的事情- 因为在这一行本身发生) - 修改一个变量并在一个序列点内同时读取它是UB.如果从对象读取先前的值但是也存在修改,则行为未定义,如i * i++
&&是一个序列点,&如果你感到困惑的话,它不是一个序列点.
序列点是尘埃沉降的时间点,并且到目前为止所见的所有副作用都保证完整.C标准中列出的序列点是:
在完整表达式的评估结束时(完整表达式是表达式语句,或任何其他表达式,它不是任何更大表达式中的子表达式); 在||,&&,?:和逗号运算符; 并在函数调用(在所有参数的评估之后,以及在实际调用之前).
标准规定了这一点
在前一个和下一个序列点之间,对象的存储值最多只能通过表达式的计算来修改一次.此外,只能访问先前值以确定要存储的值.
| 归档时间: |
|
| 查看次数: |
85 次 |
| 最近记录: |