标准没有规定C/C++表达式求值顺序

简介: 对于表达式,标准并没有规定计算顺序,所以下列代码的运行结果存在多样性: #include stdio.h> int main() {         int m = 1; ...

对于表达式,标准并没有规定计算顺序,所以下列代码的运行结果存在多样性:

  1. #include stdio.h>

  2. int main()
  3. {
  4.         int m = 1;
  5.         int n = ++m + m++ + ++m;
  6.         printf("m=%d, n=%d\n", m, n);
  7.         return 0;
  8. }

VC 6.0: m=4, n=7
VC 2013: m=4, n=9
GCC 4.1.2: m=4, n=7
GCC 4.6: m=4, n=7
GCC 4.7: m=4, n=7
GCC 4.7 (C++11): m=4, n=7
GCC 4.8: m=4, n=9
GCC 4.8 (C++11): m=4, n=9
GCC 4.9: m=4, n=9
GCC 4.9 (C++11): m=4, n=9
GCC 4.9 (C++14): m=4, n=9
clang 3.5: m=4, n=8
clang 3.5 (c++11): m=4, n=8
clang 3.5 (c++14): m=4, n=8

C语言标准的第81页(6.5节,不同版本的标准会有些差异,可直接搜索“ i = ++i + 1”)摘要:
74) This paragraph renders undefined statement expressions such as
i = ++i + 1;
a[i++] = i;

while allowing
i = i + 1;
a[i] = i;

可搜索“ISOIEC 9899-201x-C语言标准规范”下载C语言标准的pdf文档。

相关参考:
http://c-faq-chn.sourceforge.net/ccfaq/node37.html例如 i = i+1 合法, 而 a[i] = i++ 则非法, C标准强烈声明它是无定义的
http://c-faq-chn.sourceforge.net/ccfaq/node39.html

相关文章
|
1月前
|
编译器 C++
C++系列七:表达式
C++系列七:表达式
|
14天前
|
编译器 C语言 C++
C++ lambda表达式
C++ lambda表达式
|
28天前
|
算法 安全 编译器
【C++ 17 新特性 折叠表达式 fold expressions】理解学习 C++ 17 折叠表达式 的用法
【C++ 17 新特性 折叠表达式 fold expressions】理解学习 C++ 17 折叠表达式 的用法
23 1
|
1月前
|
算法 程序员 编译器
C ++匿名函数:揭开C++ Lambda表达式的神秘面纱
C ++匿名函数:揭开C++ Lambda表达式的神秘面纱
59 0
|
1月前
|
存储 JavaScript 前端开发
c++lambda函数与表达式
c++lambda函数与表达式
9 1
|
2月前
|
C++
【c++】定位new表达式(placement-new)
【c++】定位new表达式(placement-new)
【c++】定位new表达式(placement-new)
|
2月前
|
存储 算法 编译器
C++ 新特性 lamada表达式
C++ 新特性 lamada表达式
|
2月前
|
安全 C++ 开发者
c++表达式详细介绍
前言 表达式是 C++ 语言的基石之一,它们在程序中执行计算、赋值、逻辑判断和更多操作。本文旨在提供对 C++ 表达式各个方面的全面了解,包括基础概念、类型、求值规则以及高级主题。
68 0
|
3月前
|
Java Go C++
Golang每日一练(leetDay0092) 丑数 I\II Ugly Number i\ii
Golang每日一练(leetDay0092) 丑数 I\II Ugly Number i\ii
40 0
Golang每日一练(leetDay0092) 丑数 I\II Ugly Number i\ii
|
3月前
|
Java C++ Python
C/C++每日一练(20230422) 存在重复元素、组合总和、给表达式添加运算符
C/C++每日一练(20230422) 存在重复元素、组合总和、给表达式添加运算符
30 0
C/C++每日一练(20230422) 存在重复元素、组合总和、给表达式添加运算符

热门文章

最新文章