这是否被认为是未定义的行为 x = ++x % 5;
Is this considered undefined behaviour x = ++x % 5;
我一直在做嵌入式 C 项目,我找到了代码:
x = ++x % 5;
现在,首先在一个表达式中,变量 x 有 2 个副作用运算符,赋值运算符和前缀递增运算符。
根据C99标准(ISO/IEC 9899:TC3):
第 6.5 节表达式
- Between the previous and next sequence point an object shall have its stored value modified at most once by the evaluation of an expression. Furthermore, the prior value shall be read only to determine the value to be stored.
这应该被认为是未定义的行为,但我还没有在实践中成功证明这一点。
在 windows (mingw32-gcc, msvc) 和 linux:
上尝试了几个编译器
gcc version 7.3.0 (Ubuntu 7.3.0-27ubuntu1~18.04)
Ubuntu 18.04 4.15.0-36-generic
所以我的问题是,这是否被视为嵌入式中的未定义行为,在嵌入式中使用它安全吗?
如果我在 gcc
上编译代码,它会显示
source_file.c: In function ‘main’:
source_file.c:8:7: warning: operation on ‘x’ may be undefined [-Wsequence-point]
x = ++x % 5;
^
这是第一个证据,这个可能是UB。
此外,增量(写入操作,a.k.a,存储值修改)和赋值(再次写入操作,a.k.a,存储值修改)发生没有中间的序列点,所以这是未定义的行为。
话虽如此,只写
x = (x + 1) % 5 ;
好多了,可读性好,lessens the threat on your life。
我一直在做嵌入式 C 项目,我找到了代码:
x = ++x % 5;
现在,首先在一个表达式中,变量 x 有 2 个副作用运算符,赋值运算符和前缀递增运算符。
根据C99标准(ISO/IEC 9899:TC3):
第 6.5 节表达式
- Between the previous and next sequence point an object shall have its stored value modified at most once by the evaluation of an expression. Furthermore, the prior value shall be read only to determine the value to be stored.
这应该被认为是未定义的行为,但我还没有在实践中成功证明这一点。 在 windows (mingw32-gcc, msvc) 和 linux:
上尝试了几个编译器gcc version 7.3.0 (Ubuntu 7.3.0-27ubuntu1~18.04)
Ubuntu 18.04 4.15.0-36-generic
所以我的问题是,这是否被视为嵌入式中的未定义行为,在嵌入式中使用它安全吗?
如果我在 gcc
上编译代码,它会显示
source_file.c: In function ‘main’: source_file.c:8:7: warning: operation on ‘x’ may be undefined [-Wsequence-point] x = ++x % 5; ^
这是第一个证据,这个可能是UB。
此外,增量(写入操作,a.k.a,存储值修改)和赋值(再次写入操作,a.k.a,存储值修改)发生没有中间的序列点,所以这是未定义的行为。
话虽如此,只写
x = (x + 1) % 5 ;
好多了,可读性好,lessens the threat on your life。