作者loveme00835 (发箍)
看板C_and_CPP
标题Re: [问题] A[x++] = --x
时间Mon Sep 13 03:25:50 2021
※ 引述《CaliforCat (Cal)》之铭言:
: int main()
: {
: int A[3] = {0, 0, 0};
: int x = 1;
: A[x++] = --x;
: printf("A[0]=%d, A[1]=%d, A[2]=%d", A[0], A[1], A[2]);
: }
虽然推文一致认为这题的答案会和 x++ 还有 --x 的执行顺序有关,
但实际上并没有这麽简单. 在对阵列 A 元素做赋值以前, 有两个条
件需要先被满足:
1. 阵列索引是合法的
(0 ~ 2)
2. 赋予的值是合法的
(INT_MIN ~ INT_MAX)
只要其中一个前提不成立, 讨论赋值结果是没有意义的. 也就是说
当 x 值为以下其中一种, 我们都可以跳过讨论执行顺序:
1. -2
2. 4
3. INT_MIN
4. INT_MAX
因为只要
UB (Undefined Behavior) 已经发生, 後面所有基於这个
side-effect 的程式码行为都是未定义的. 所以
解决的策略通常是
消除最早发生的 UB; 而不是最明显的 UB.
如果是我, 在丢出执行顺序议题以前, 我会和面试官先确认 x 值不
会先导致其他的 UB, 接着才把这题直接丢弃掉. 要是有人说:「x
值不就是 1, 哪还会有其他可能?」这又是别的故事惹..
--
[P1389R1] Standing Document for SG20: Guidelines for Teaching
C++ to Beginners
https://wg21.link/p1389r1
SG20 Education and Recommended Videos for Teaching C++
https://www.cjdb.com.au/sg20-and-videos
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 118.233.156.253 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1631474754.A.B77.html
※ 编辑: loveme00835 (118.233.156.253 台湾), 09/13/2021 03:36:04
1F:→ fatrabitree: x还会等於几? 09/17 03:12