是否认为这是未定义的行为x = ++ x%5;

时间:2018-11-22 09:50:36

标签: c c99 sequence-points

我一直在从事嵌入式C项目,发现代码:

x = ++x % 5; 

现在,首先在一个表达式中的变量x上有2个副作用运算符,赋值和前缀增量运算符。

根据C99标准(ISO / IEC 9899:TC3):

第6.5节表达式

  
      
  1. 在上一个序列点与下一个序列点之间,对象的存储值最多只能通过对表达式的求值来修改。此外,在先值只能是只读的,以确定要存储的值。
  2.   

这应被视为未定义的行为,但我尚未在实践中证明这一点。 在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

所以我的问题是,这在嵌入式系统中是否被认为是未定义的行为,并且在嵌入式系统中使用它是否安全?

1 个答案:

答案 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