(操作符详解p2)C语言从入门到入土(入门篇)(四)

简介: 7. 关系操作符 8. 逻辑操作符 9. 条件操作符(三目操作符) 10. 逗号表达式 11. 下标引用、函数调用和结构成员 1. [ ] 下标引用操作符 2. ( ) 函数调用操作符 3. 访问一个结构的成员 12. 表达式求值 12.1 隐式类型转换 12.2 算术转换 12.3 操作符的属性

 一些问题表达式

//表达式的求值部分由操作符的优先级决定。
//表达式1 a*b + c*d + e*f

注释:代码1在计算的时候,由于*比+的优先级高,只能保证,*的计算是比+早,但是优先级并不


能决定第三个 * 比第一个 + 早执行。

所以表达式的计算机顺序就可能是:



121.png122.png


//表达式2 
c + --c;

注释:同上,操作符的优先级只能决定自减 -- 的运算在 + 的运算的前面,但是我们并没有办法得

知, + 操作符的左操作数的获取在右操作数之前还是之后求值,所以结果是不可预测的,是有歧义

的。


//代码3-非法表达式
int main()
{
 int i = 10;
 i = i-- - --i * ( i = -3 ) * i++ + ++i;
 printf("i = %d\n", i);
 return 0; }

表达式 3 在不同编译器中测试结果:非法表达式程序的结果


123.png

//代码4
int fun()
{
     static int count = 1;
     return ++count; }
int main()
{
     int answer;
     answer = fun() - fun() * fun();
     printf( "%d\n", answer);//输出多少?
     return 0; }

这个代码有没有实际的问题?

有问题!

虽然在大多数的编译器上求得结果都是相同的。

但是上述代码 answer = fun() - fun() * fun() ; 中我们只能通过操作符的优先级得知:先算乘法,

再算减法。

函数的调用先后顺序无法通过操作符的优先级确定。

//代码5
#include <stdio.h>
int main()
{
 int i = 1;
 int ret = (++i) + (++i) + (++i);
 printf("%d\n", ret);
 printf("%d\n", i);
 return 0; }
//尝试在linux 环境gcc编译器,VS2013环境下都执行,看结果。

Linux 环境的结果:

124.png


VS2013环境的结果:

125.png


看看同样的代码产生了不同的结果,这是为什么?

简单看一下汇编代码 . 就可以分析清楚 .

这段代码中的第一个 + 在执行的时候,第三个 ++ 是否执行,这个是不确定的,因为依靠操作符的优先级

和结合性是无法决定第一个 + 和第

三个前置 ++ 的先后顺序。


总结 :

我们写出的表达式如果不能通过操作符的属性确定唯一的计算路径,那这个表达式就是存在问题 的。

今天的内容就到这里了哈!!!


要是认为作者有一点帮助你的话!


就来一个点赞加关注吧!!!当然订阅是更是求之不得!


最后的最后谢谢大家的观看!!!


你们的支持是作者写作的最大动力!!!


下期见哈!!!

相关文章
|
13天前
|
存储 编译器 C语言
爱上C语言:操作符详解(下)
爱上C语言:操作符详解(下)
|
25天前
|
算法 测试技术 C语言
【C语言】异或(^)操作符
【C语言】异或(^)操作符
16 0
|
1月前
|
C语言
王桂林C语言从放弃到入门课程
课程目标16天,每天6节课,每节40分钟课堂实录,带你征服C语言,让所有学过和没有学过C语言的人,或是正准备学习C语言的人,找到学习C语言的不二法门。适用人群所有学过和没有学过C语言的人,或是正准备学习C语言的人!
25 2
王桂林C语言从放弃到入门课程
|
1月前
|
存储 算法 程序员
【c 语言 】位操作符详解
【c 语言 】位操作符详解
38 0
|
3天前
|
存储 自然语言处理 编译器
振南技术干货集:振南当年入门C语言和单片机的那些事儿(3)
振南技术干货集:振南当年入门C语言和单片机的那些事儿(3)
|
29天前
|
存储 编译器 程序员
C语言第十六弹---操作符(下)
C语言第十六弹---操作符(下)
|
27天前
|
编译器 C语言 索引
C语言操作符详解(上)
C语言操作符详解(上)
44 0
|
27天前
|
Java C语言 C++
C语言由入门到精通(1)介绍与数据类型
C语言由入门到精通(1)介绍与数据类型
|
1月前
|
存储 安全 编译器
【 c 语言 】赋值操作符详解
【 c 语言 】赋值操作符详解
81 0
|
14天前
|
程序员 C语言
C语言库函数 — 内存函数(含模拟实现内存函数)
C语言库函数 — 内存函数(含模拟实现内存函数)
24 0