`
include0923
  • 浏览: 7723 次
  • 性别: Icon_minigender_1
  • 来自: 广州
最近访客 更多访客>>
社区版块
存档分类
最新评论

C语言中避免未定义求值顺序的方法

阅读更多

    前面几篇文章一直在说关于未定义表达式求值顺序的问题,是时候做一点总结了,很多教材都建议在程序中尽量少用未定义的表达式,因为确定序列点确实是一件让人不爽的事,这里 一些建议,或许能减少未定义表达式的出现频率。

   1、确保一个表达式最多只修改一个对象:一个简单变量,一个数组成员、一个指针指向的位置。“修改”指的是诸如:=+=、-=等赋值操作和++、--运算。

  2、如果一个对象在一个表达式中出现一次以上而且在表达式中要被修改,则要确保对该对象的所有的读访问被用于计算它的最终值,该条规则允许i=i+1合法且有实在定义

 3、如果想破坏第一条规则,则要确保修改的对象互不相同。

  4、如果在两次修改或修改和访问之间置入定义的序列点操作符,则可以破坏第一条和第二条规则。例如:while( c = getchar()!=EOF && c!='\n'){...} ,这条表达式是合法的,因为虽然表达式两次访问 了同一个变量的值,但是第二次c 的访问是出现在&&引入的序列点之后。所以 不会受c值 可能被 修改影响。

分享到:
评论

相关推荐

    序列点在C语言表达式求值中的作用

    在教学中,引入序列点的概念可以帮助学生深入理解C语言的表达式求值规则,避免因混淆操作符优先级和序列点而导致的错误。掌握序列点对于解决复杂表达式、编写高效代码以及调试程序都至关重要。在编写涉及副作用的...

    C语言中自增自减表达式的未定义行为.pdf

    总之,C语言的自增自减运算符是编程中既实用又具有挑战性的工具,需要程序员小心使用以避免产生未定义行为。在设计和编写程序时,应该尽量避免在同一个表达式中对同一变量进行多次自增或自减操作,以防出现未定义的...

    C语言的这个小细节,绝对值得你去看.pdf

    因此,在编写涉及多个操作数和操作符的复杂表达式时,程序员需要特别小心,尽量避免依赖未定义的求值顺序。 文档中还提到,C语言中使用的char类型是有符号的,其范围通常是从-128到127(这取决于具体的系统和编译器...

    c语言中自增自减的探讨

    在C语言中,自增和自减运算符是编程中...在编写涉及自增和自减的代码时,应特别注意运算符的位置、结合性和优先级,以及避免未定义的行为。通过学习和实践,开发者能够熟练地运用这些运算符,提升编程效率和代码质量。

    C语言中指针自增自减运算常见错误分析.pdf

    综上所述,正确理解和使用C语言中的指针自增自减运算需要对指针的基础概念有深入的理解,注意操作的顺序和指针的动态变化。避免这些常见错误能够提高程序的正确性和效率,使得C语言编程更加得心应手。

    数据结构---栈和队列之顺序队(C语言)

    栈常用于表达式求值、函数调用和回溯算法等场景。 队列则是一种先进先出(FIFO)的数据结构,即最先插入的元素最先被删除。队列的基本操作包括入队(enqueue,将元素添加到队尾)和出队(dequeue,移除队头元素)。...

    C语言序列点总结

    序列点是C语言中的一个重要概念,它指的是程序运行中的一个特殊时间点,在该点之前的所有副作用已经结束,并且后续的副作用还没发生,而两个序列点之间所有的表达式或代码执行顺序是未定义的。 副作用是指对数据...

    标准c语言笔记.pdf

    在C语言中,常量和常量表达式具有编译时确定的值,它们在程序中不能被修改。命令行参数则是main函数的两个参数,通常是传递给程序的启动参数。函数声明的两个缺陷指的是函数原型的缺失可能导致的问题,例如参数类型...

    C语言出错中英文对照

    在C语言编程中,错误是常见的情况,它们可以帮助开发者定位并修复代码中的问题。下面将对标题和描述中提到的一些C语言错误进行详细解释,并扩展相关的编程知识点。 1. **Ambiguous operators need parentheses** - ...

    学习c语言时需注意的问题

    此外,初始化变量也是一个好习惯,可以避免未定义行为。 **2. scanf 函数的使用** - **格式化字符串与变量地址** - 正确使用 `scanf` 函数,需要在格式化字符串后面紧跟变量的地址。例如:`scanf("%d %d", &a, &b...

    打印螺旋矩阵(C语言实现)

    1. **初始化矩阵**:创建一个n×m的二维数组,并将其所有元素初始化为0或未定义值。 2. **设置四个边界条件**:定义四个变量,分别表示当前循环的四个边界:top(顶部行)、bottom(底部行)、left(左侧列)和...

    C语言的错误提醒及其中文翻译

    在学习和使用C语言编程的过程中,不可避免地会遇到编译器给出的各种错误提示。这些错误提示对于初学者来说可能显得晦涩难懂,尤其是当它们以英文形式出现时。但是,了解这些错误的含义并掌握对应的解决方法是提高...

    495个C语言常见问题集

    序列点是C语言中的概念,用于定义表达式中各个子表达式的求值顺序。理解序列点有助于理解复杂的表达式,特别是当表达式中包含多个赋值操作时。 #### 3.8 那么,对于a[i]=i++; 我们不知道a[]的哪一个分量会被改写,但i...

    C语言避坑指南.pdf

    C语言中表达式的求值顺序未定义,这可能导致不可预测的结果。 **解决方案**: 避免在表达式中多次使用同一个变量,除非确信其副作用不会影响结果。 ##### 4.2 `&&`、`||` 和 `!` 运算符 逻辑运算符 `&&` 和 `||` ...

Global site tag (gtag.js) - Google Analytics