繁体   English   中英

C编程:运算符优先级之间的混淆

[英]C Programming : Confusion between operator precedence

我对运算符的优先级感到困惑,想知道如何评估该语句。

# include <stdio.h>

int main()
{
  int k=35;  
  printf("%d %d %d",k==35,k=50,k>40);  
  return 0;  
}

这里k最初的值为35,当我在printf测试k ,我认为:

  1. k>40应检查为0
  2. k==35应该被检查,结果应该为1
  3. 最后,应将50分配给k ,并应输出50

因此最终输出应为1 50 0 ,但输出为0 50 1

您不能依赖此程序的输出,因为它是undefined behavior ,未在C中指定评估顺序,因为这使编译器可以根据C99草案标准第6.5节第3段进行更好的优化:

语法表示操作符和操作数的分组。74)除非稍后指定(对于函数调用(),&&,||,?:和逗号运算符), 子表达式的求值顺序和哪种副作用都未指定。

它也是未定义的,因为您正在访问k的值并在同一sequence point为其分配sequence point 从标准草案第6.5条第2款:

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

它引用了以下未定义的代码示例:

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

更新资料

关于函数调用中的逗号是否充当序列点的评论。 如果我们看6.5.17 Comma operator节, 6.5.17 Comma operator2段会说:

逗号运算符的左操作数被评估为void表达式; 评估后有一个序列点。

但是第3段说:

示例如语法所示,逗号运算符(如本小节中所述) 不能出现在使用逗号分隔列表中的项(例如函数的参数或初始化器列表 )的上下文中

因此,在这种情况下,逗号不会引入序列点。

未指定函数参数的评估顺序。 可以按任何顺序对它们进行评估。 编译器决定。

这是未定义的行为

您可能会获得任何价值。 在两个连续执行中缺少序列点 提高警告的严格性级别,您会得到warning: operation on 'k' may be undefined

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM