精华内容
下载资源
问答
  • c语言表达式计算顺序

    2020-03-28 11:18:57
    C 语言中,任何表达式的子表达式求值顺序是未指定的,编译器可能以任意顺序对这个表达式求值,而且同一表达式再度求值时可能会采用另一种顺序。 C 中有运算符从左到右 / 从右到左结合性,但没有从左到右 / 从右到左...

    普通的表达式计算按 运算符优先级 来就可以了。

    在表达式中,若操作符的优先级相同,结合性 就起仲裁的作用:由它决定哪个操作符先执行,先执行可以看做是加上括号。

    大多数 运算符结合方向 是“自左至右”, 即: 先左后右, 例如 a- b+c , b 两侧有 -+ 两种运算符的优先级相同, 按先左后右结合方向, b 先与减号结合, 执行a - b 的运算, 再执行加 c 的运算。

    除了自左至右的结合性外, C 语言有 三类运算符 参与运算的结合方向是从右至左。即: 单目运算符, 条件运算符, 赋值运算符

    比如右结合(从右到左),那就是,把右边的运算用括号先括起来,再与左边的进行计算,这样自然是先执行右边的了。
    比如

    int a,b=1,c=2;
    a=b=c;
    

    这里 =的结合性是 从右到左 。 故 a=b=c; 可变为 a=(b=c); 即 a 最终为 2。

    再比如,求 -i++-++i 的值:由于 -++ 都是单目运算符,且处于同一大优先级。所以 都是先执行 ++ 操作。但在 -i++ 中, ++ 后置于变量,所以 i 原来的值先被使用,然后再自加。


    • C 语言没有指定任何表达式的子表达式求值顺序
      编译器可能以任意顺序对这个表达式求值,而且同一表达式再度求值时可能会采用另一种顺序。

    如:表达式 ( f1( ) + f2( ) ) ,操作符 + 具有从左到右的结合性,但在运行时对f1( )f2( ) 这 2 个函数的调用可以是任意顺序。f1( ) 可能是第一个被调用,也有可能是 f2( ) 第一个被调用。
    f1( ) 或者 f2( ) 会改变另一个函数所使用的变量,那么整个表达式的结果会依赖于这两个函数的计算顺序!!!

    • C 语言也没有指定函数各个参数求值顺序。
    printf("%d 	%d\n", ++n, power(2, n));
    

    上面的语句执行结果不同的编译器可能不一样!!

    展开全文
  • 计算机二级等级考试C语言顺序结构讲解.ppt* * 第3章 顺序结构程序设计 3.1 赋值语句 赋值语句是由赋值表达式再加上分号构成的表达式语句。 赋值语句的一般形式为: 变量=表达式; 赋值语句的功能和特点都与赋值表达式...

    计算机二级等级考试C语言顺序结构讲解.ppt

    * * 第3章 顺序结构程序设计 3.1 赋值语句 赋值语句是由赋值表达式再加上分号构成的表达式语句。 赋值语句的一般形式为: 变量=表达式; 赋值语句的功能和特点都与赋值表达式相同。 第3章 顺序结构程序设计 3.2 输入输出函数 C语言要求在使用输入/输出库函数之前必须包含stdio.h文件。 包含形式如下: #include 或 #include "stdio.h" 第3章 顺序结构程序设计 3.2 输入输出函数 3.2.1 字符数据输入输出函数 1.字符数据输入函数 格式:getchar() 功能:从键盘上接收输入的一个字符。 例3.1 从键盘输入一个字符,并将其存入字符型变量c 中。 #include "stdio.h" main() { char c; c= getchar(); } 其中c是字符型(char)或整型(int)变量。 第3章 顺序结构程序设计 3.2 输入输出函数 3.2.1 字符数据输入输出函数 1.字符数据输入函数 2.字符数据输出函数 格式:putchar(c) 功能:向终端输出一个字符。 说明:(1)c可以是字符型,也可以是整型。 (2)c可以是变量,可以是常量,也可以是表达式。 第3章 顺序结构程序设计 3.2 输入输出函数 3.2.1 字符数据输入输出函数 1.字符数据输入函数 2.字符数据输出函数 例3.2 从键盘输入一个字符,在屏幕上显示出来。 #include "stdio.h" main() { char c; c=getchar(); /*从键盘输入一个字符*/ putchar(c); /*在屏幕上显示一个字符*/ } 第3章 顺序结构程序设计 3.2 输入输出函数 3.2.2 格式化输入输出函数 1.格式化输出函数 格式: printf(格式控制,输出项表); 功能:将“输出项表”中给出的输出项按“格式控制”中规定的输出格式输出到标准输出设备。 说明: (1)输出项表中以逗号分隔列出需要输出的项(变量、常量、或表达式)。 (2)格式控制是用双引号括起来的字符串,包括普通字符和格式说明。 普通字符:是需要原样输出的字符(包括转义字符)。 格式说明:由“%“和格式符组成,如%c和%f等,作用是将要输出的数据转换为指定格式后输出。 printf函数中使用的格式字符如表所示。 按宽度m,n位小数或截取字符串前n个字符输出,左对齐 -m,n格式字符 按宽度m,n位小数或截取字符串前n个字符输出,右对齐 m,n格式字符 按宽度m输出,左对齐 -m格式字符 按宽度m输出,右对齐 m格式字符 按无符号长整型输出 lu 长十六进制整型输出 lx 长八进制整型输出 lo 长整型输出 ld 输出以‘\0’结尾的字符串 s 按指数形式输出单、双精度浮点数 e 按十进制形式输出单、双精度浮点数(默认6位小数) f 按字符形式输出一个字符 c 按十进制无符号形式输出 u 按十六进制形式无符号输出(无前导ox) ox 按八进制形式无符号输出(无前导o) o 按十进制形式输出带符号的整数(正数前无+号) d 功能 格式字符 例3.3 #include main() { int a=123; long b=135790; printf("a=%d\n",a); printf("a=%4d\n",a); printf("a=%2d\n",a); printf("b=%ld",b); } 屏幕显示结果: a=123 a= 123 a=123 b=135790 例3.4 #include main() { int a=-1; char c='a'; printf("%d,%o,%x,%u\n",a,a,a,a); printf("%d,%c\n",c,c); } 屏幕显示结果: -1,177777,ffff,65535 97,a 例3.5 #include "stdio.h" main() { printf("%s,%7.2s\n", "CHINA", "CHINA" ); printf(" %.4s,%-5.3s\n", "CHINA", "CHINA"); } 屏幕显示结果: CHINA,- - - - -CH CHIN,CHI- - (注:-表示空格。) 例3.6 #include main() { float a=1.23; printf("%f,%7.2f,%2.1f\n", a,a,a ); } 屏幕显示结果: 1

    展开全文
  • C语言-顺序

    2020-03-29 12:56:42
    C语言-顺序顺序表: 是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构。线性表采用顺序存储的方式存储就称之为顺序表。顺序表是将 表中的结点依次存放在...

    C语言-顺序表

    顺序表:

    是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构。线性表采用顺序存储的方式存储就称之为顺序表。顺序表是将
    表中的结点依次存放在计算机内存中一组地址连续的存储单元中

    typedef struct {
    	int id;
    	char name[20];
    }ElementType;//定义ElementType变量
    

    typedef struct {
    	ElementType datas[MAX_SIZE];//能插入元素的最大容量大小
    	int length;//当前顺序表的长度
    }SeqList;//定义顺序表的结构体
    
    
    void InitSequence(SeqList* seqList, ElementType* elemArray, int length);
    //上面是初始化顺序表
    void InsertSequence(SeqList* seqList, int index, ElementType elemArray);
    //上面是向顺序表插入元素,其中index是想向数组中插入的位置
    void PrintSequence(SeqList* seqList);
    //上面是打印顺序表
    

    以下是具体实现代码:

    void InitSequence(SeqList* seqList, ElementType* elemArray, int length)
    {
    	if (length > MAX_SIZE)
    	{
    		printf("当前长度超过数组的最大容量");
    		return;
    	}
    	seqList->length = 0;
    	for (int i = 0; i < length; i++)
    	{
    		InsertSequence(seqList, i, elemArray[i]);
    	}
    }
    
    void InsertSequence(SeqList* seqList, int index, ElementType elemArray)
    {
    	if (seqList->length + 1 > MAX_SIZE)
    	{
    		printf("插入失败,超过数组的最大长度");
    		return;
    	}
    	if (index < 0 || index >MAX_SIZE)
    	{
    		printf("插入的下标不在数组的范围内");
    		return;
    	}
    	if (index > seqList->length)
    	{
    		printf("插入下标超过了数组的长度");
    		return;
    	}
    	for (int i = seqList->length - 1; i >= index; i--)
    	{
    		seqList->datas[i + 1] = seqList->datas[i];
    	}
    	seqList->datas[index] = elemArray;
    	seqList->length++;
    }
    
    void PrintSequence(SeqList* seqList)
    {
    	for (int i = 0; i < seqList->length; i++)
    	{
    		printf("%d\t%s\n", seqList->datas[i].id, seqList->datas[i].name);
    	}
    }
    

    以下是主函数中调用:

    void TestSequence();
    
    ElementType elemArray[]=
    {
    	{1,"小米"},
    	{2,"小说"},
        {3,"萨达"}
    };
    
    int main()
    {
    	TestSequence();
    	return 0;
    }
    
    void TestSequence()
    {
    	SeqList seqList;
    	InitSequence(&seqList, elemArray, 3);
    	PrintSequence(&seqList);
    }
    

    以下是运行结果:
    在这里插入图片描述

    展开全文
  • 计算顺序 是怎样的? (2)两个编译器如何对x++,++x处理的?   VS2013反汇编代码 int x = 3; 010352CE mov dword ptr [x],3 printf("%d%d%d%d%d%d", x, x++, x, ++x, x--, x); //x-- ...

    不同编译器产生的结果不同,本文测试环境为VS2013和VC6.

                                                                                                                                                                  

    先看以下代码:

    int x = 3;
    printf("%d%d%d%d%d%d", x, x++, x, ++x, x--, x);

    VS2013输出结果:434434  

    VC6输出结果:444433


    那么问题来了:

    (1)两个编译器printf的压栈顺序和计算顺序是怎样的?

    (2)两个编译器如何对x++,++x处理的?

                                                                                                                                                                  


    VS2013反汇编代码

            int x = 3;
    010352CE  mov         dword ptr [x],3  
    	printf("%d%d%d%d%d%d", x, x++, x, ++x, x--, x);
    //x--
    010352D5  mov         eax,dword ptr [x]  
    010352D8  dword       ptr [ebp-0D0h],eax //此时x = 3 ,将 x 的值存在 ebp-0d0h 这个相对地址中
    010352DE  mov         ecx,dword ptr [x]  
    010352E1  sub         ecx,1  
    010352E4  mov         dword ptr [x],ecx  
    	printf("%d%d%d%d%d%d", x, x++, x, ++x, x--, x);
    //++x  直接在edx完成
    010352E7  mov         edx,dword ptr [x] 
    010352EA  add         edx,1
    010352ED  mov         dword ptr [x],edx //x = 3
    //x++ 
    010352F0  mov         eax,dword ptr [x]  
    010352F3  mov         dword ptr [ebp-0D4h],eax //此时x = 3 ,将 x 的值存在 ebp-0d4h 这个相对地址中
    010352F9  mov         ecx,dword ptr [x]  
    010352FC  add         ecx,1
    010352FF  mov         dword ptr [x],ecx 
    //压栈
    01035302  mov         esi,esp  
    01035304  mov         edx,dword ptr [x]  
    01035307  push        edx //4
    01035308  mov         eax,dword ptr [ebp-0D0h]  
    0103530E  push        eax //ebp-0D0h 地址中值为 3
    0103530F  mov         ecx,dword ptr [x]  
    01035312  push        ecx //4
    01035313  mov         edx,dword ptr [x]  
    01035316  push        edx //4
    01035317  mov         eax,dword ptr [ebp-0D4h]  
    0103531D  push        eax //ebp-0D4h 地址中值为 3
    0103531E  mov         ecx,dword ptr [x]  
    01035321  push        ecx //4
    01035322  push        103CA54h  
    01035327  call        dword ptr ds:[1040184h]  
    结果 434434
    
    VC6反汇编代码

            int x = 3
    00401028  movd        word ptr [ebp-4],3
    	printf("%d%d%d%d%d%d",x,x++,x,++x,x--,x);
    0040102F  mov         eax,dword ptr [ebp-4]
    00401032  push        eax //x = 3
    //x--
    00401033  mov         ecx,dword ptr [ebp-4]
    00401036  mov         dword ptr [ebp-8],ecx //ebp-8 值为3
    00401039  mov         edx,dword ptr [ebp-8]
    0040103C  push        edx //x = 3
    //++x 在eax完成
    0040103D  mov         eax,dword ptr [ebp-4]
    00401040  add         eax,1
    00401043  mov         dword ptr [ebp-4],eax
    00401046  mov         ecx,dword ptr [ebp-4]
    00401049  push        ecx //x = 4
    0040104A  mov         edx,dword ptr [ebp-4]
    0040104D  push        edx //x = 4
    //x++
    0040104E  mov         eax,dword ptr [ebp-4]
    00401051  mov         dword ptr[ebp-0Ch],eax //ebp-0ch 值为4
    00401054  mov         ecx,dword ptr[ebp-0Ch]
    00401057  push        ecx //x = 4
    00401058  mov         edx,dword ptr [ebp-4]
    0040105B  push        edx //x = 4
    0040105C  push        offset string"%d%d%d%d%d%d" (0042201c)
    00401061  mov         eax,dword ptr [ebp-4] //操作的是x值
    00401064  add         eax,1 
    00401067  mov         dword ptr [ebp-4],eax
    0040106A  mov         ecx,dword ptr [ebp-4] //同上
    0040106D  sub         ecx,1
    00401070  mov         dword ptr [ebp-4],ecx
    00401073  call        printf (004010b0)	
    结果 444433
    

                                                                                                                                                                  

    由上反汇编代码,我们可以得出以下结论:

    (1)两个编译器的压栈顺序相同:从右到左  计算顺序:因编译器而异,与压栈顺序无关。

    (2)++x: 两编译器的处理方式相同,直接对寄存器进行值进行修改。

             x++:VS2013将x值先保存在某个相对地址中,再对现有x值累加计算,并继续其他运算,最后将存储的x值压入栈中;VC6直接将x值压入栈,并进行其他运算,压栈完成以后再对x值进行累加计算。

    总结:结果不同的原因是由于两个编译器对x++处理方式的不同,在比较x++和++x的实现方式时,我们发现x++会在实现中产生一个副本,如果这个副本足够大的时候,在一定程度上会影响计算的效率,应此++x应该优先使用。


    以上只是个人观点,有不合理之处欢迎各位指点。




    展开全文
  • 最近闲来无事,就顺便把数据结构再复习一下,在此把我刚写的c语言实现的顺序结构线性表送给大家,不要吝啬评论哦。#include "stdio.h"#include "stdlib.h"#include "io.h"#include "math.h"#include "time.h"#define...
  • C语言实现顺序

    2017-09-26 20:15:41
    顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组...这里我用C语言实现了一下顺序表的具体操作。其中用了一些C++的小语法。所以有可能不能直接建立.c文件然后运行,需要建.cpp文件。#include #include<s
  • C语言顺序

    千次阅读 2019-06-13 08:23:34
    顺序表是计算机内部存储的一张线性表,这里用一组连续的数组向大家介绍详细表。 首先是定义顺序表的长度 #define MaxSize 10 接下来是向顺序表中添加元素: /* 参数: sqlist:顺序表的首地址 len: 顺序...
  • C语言动态顺序

    2017-07-28 17:09:39
    顺序表是将表中的节点依次存放在计算机内存中一组地址连续的存储单元中,表可以动态增长,尾插元素,尾删元素,头插元素,头删元素,打印元素,查找元素,插入指定位置的元素,删除指定元素,删除所有指定的元素,...
  • C语言顺序

    2017-03-06 20:48:52
    顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构,下面我们简单实现顺序表。 test.c中 #define _CRT_SECURE_NO_WARNINGS 1 #include "seqlist.h" void...
  • 3.1 表达式语句、函数调用语句和空语句1.C语言的语句共分五大类:表达式语句、控制语句、函数调用语句、空语句和复合语句。2.表达式语句的一般形式为表达式;最典型的表达式语句是由一个赋值表达式加一个分号构成的...
  • C语言顺序程序设计

    2018-11-16 19:28:41
    一.C语言概述 C程序的结构 C程序的执行部分是由语句组成的。 程序的功能也是由执行语句实现的。 C 语句可分为以下五类: (1)表达式语句:表达式语句由表达式加上分号“;”组成。执行表达式语句就是计算...
  • 参考资料:高教版《全国计算机等级考试二级教程——C语言程序设计》、《21天学通C语言》。赋值语句在赋值表达式的尾部加上一个分号,就构成了赋值语句。注意:变量定义时赋初值和赋值语句不相同。数据输出把数据从...
  • C语言中5种基本数据类型的存储空间长度的排列顺序來源:互聯網2010-04-22 19:19:59評論分類: 電腦/網絡 >> 程序設計 >> 其他編程語言問題描述:在C语言中,5种基本数据类型的存储空间长度的排列顺序为:...
  • 这也就是说逗号分隔的函数参数与逗号操作符是不一样的,不保证从左至右的计算顺序(当然也没有保证从右至左)。 注意这个evaluation,其实就是对test(2), test(1)的调用。如果这些调用有边界效应,在不同编译器、...
  • c语言 计算存款利息

    千次阅读 2020-07-19 15:48:46
    输入在一行中顺序给出三个正实数money、year和rate,以空格分隔。 输出格式: 在一行中按“interest = 利息”的格式输出,其中利息保留两位小数。 输入样例: 1000 3 0.025 输出样例: interest = 76.89 #include
  • 来看下面一段代码: #include #include using namespace std;...可见,编译器在编译printf()函数时,是从后往前计算参数,然后从前往后输出的。 这个原理很简单,VC下函数参数进栈是从右往左的  
  • C语言计算存款利息

    千次阅读 2020-05-23 18:02:42
    输入在一行中顺序给出三个正实数money、year和rate,以空格分隔。 输出格式: 在一行中按“interest = 利息”的格式输出,其中利息保留两位小数。 输入样例: 1000 3 0.025 输出样例: interest = 76.89 思路:按照...
  • C语言 计算平均成绩

    千次阅读 2020-09-04 17:58:19
    给定N个学生的基本信息,包括学号(由5个数字组成的字符串)、姓名(长度小于10的不包含空白字符的非空字符串)和成绩([0,100]区间内的整数),要求计算他们的平均成绩,并顺序输出平均线以下的学生名单。...
  • [编程语言][C语言]C语言顺序结构

    千次阅读 2015-01-01 09:02:41
    在这一部分,我们将较为正式地开始编写代码,并且学习程序的三种基本结构之一——顺序结构。  计算机的组成原理决定了我们程序指令在局部是顺序执行的。也就是说,只有执行了前一条指令,后一条指
  • C语言 计算职工工资

    千次阅读 2020-09-03 17:19:48
    计算职工工资 题目描述: 给定N个职员的信息,包括姓名、基本工资、浮动工资和支出,要求编写程序顺序输出每位职员的姓名和实发工资(实发工资=基本工资+浮动工资-支出)。 输入格式: 输入在一行中给出正整数N。...
  • 解题思路确定计算本息和的公式 从数学知识可知若存款额为p0则 (1) 活期存款一年后本息和为 p1 = p0(1 + r1) (2) 一年期定期存款一年后本息和为 p2 = p0(1 + r2) (3) 两次半年定期存款一年后本息和为;输入p0,
  • C语言实现顺序表的基本操作

    千次阅读 2018-08-06 15:08:07
    线性表的顺序存储是指在内存中用一组地址连续的存储单元依次存储线性表的各元素,用这种存储形式存储的线性表称为顺序表。也就是说,顺序表以数据元素在计算机内的物理位置相邻来表示数据元素在线性表中的逻辑相邻...
  • c语言 计算平均成绩

    千次阅读 2020-04-04 16:11:14
    给定N个学生的基本信息,包括学号(由5个数字组成的字符串)、姓名(长度小于10的不包含空白字符的非空字符串)和成绩([0,100]区间内的整数),要求计算他们的平均成绩,并顺序输出平均线以下的学生名单。...
  • 一、顺序表  顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构。线性表采用顺序存储的方式存储就称之为顺序表。顺序表是将表中的结点依次存放在计算机...
  • c语言 计算职工工资

    千次阅读 2020-04-04 15:27:42
    给定N个职员的信息,包括姓名、基本工资、浮动工资和支出,要求编写程序顺序输出每位职员的姓名和实发工资(实发工资=基本工资+浮动工资-支出)。 输入格式: 输入在一行中给出正整数N。随后N行,每行给出一位职员的...
  • Problem Description Betty owns a lot of ponds, some of them are connected with other ponds by pipes, and there will not be more than one pipe between two ponds. Each pond has a value v. ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,852
精华内容 1,140
关键字:

c语言计算顺序

c语言 订阅