我一直在从事嵌入式C项目,发现代码:
x = ++x % 5;
现在,首先在一个表达式中的变量x上有2个副作用运算符,赋值和前缀增量运算符。
根据C99标准(ISO / IEC 9899:TC3):
第6.5节表达式
- 在上一个序列点与下一个序列点之间,对象的存储值最多只能通过对表达式的求值来修改。此外,在先值只能是只读的,以确定要存储的值。
这应被视为未定义的行为,但我尚未在实践中证明这一点。 在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
所以我的问题是,这在嵌入式系统中是否被认为是未定义的行为,并且在嵌入式系统中使用它是否安全?
答案 0 :(得分:3)
如果我在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。
此外,增量(写操作,又名,存储值修改)和赋值(再一次写操作,又名,存储值修改)发生而之间没有序列点,所以这是不确定的行为。
也就是说,只要写
x = (x + 1) % 5 ;
更好,更易读且lessens the threat on your life。