首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么第一个C代码的结果是一个变量,而第二个是3个变量。有没有办法通过细微的改变就能让第一个程序工作呢?

第一个C代码的结果是一个变量,而第二个是3个变量的原因是因为在第一个代码中,使用了逗号运算符,逗号运算符会依次计算每个表达式,并返回最后一个表达式的结果作为整个表达式的结果。因此,第一个代码中的逗号运算符会依次计算a=1, b=2, c=3,并将最后一个表达式c=3的结果作为整个表达式的结果,因此结果是一个变量。

而在第二个代码中,使用了多个赋值语句,每个赋值语句都会将一个值赋给一个变量。因此,第二个代码中的三个赋值语句会依次将1赋给a,2赋给b,3赋给c,因此结果是三个变量。

要让第一个程序工作,可以通过细微的改变来实现。可以将逗号运算符改为分号,分号在C语言中表示语句的结束,不会像逗号运算符那样返回最后一个表达式的结果。因此,将逗号运算符改为分号后,每个赋值语句都会成为一个独立的语句,分别将1赋给a,2赋给b,3赋给c,从而实现了三个变量的赋值。修改后的代码如下:

代码语言:txt
复制
#include <stdio.h>

int main() {
    int a, b, c;
    a = 1;
    b = 2;
    c = 3;
    printf("a = %d, b = %d, c = %d\n", a, b, c);
    return 0;
}

这样修改后的程序就会输出三个变量的值。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

JUC并发编程之Volatile关键字详解

那么这就会有一个问题,当线程B对工作内存中的initFlag值进行改变后,然后将initFlag值从工作内存中推回到主内存,这时候线程A可能不会立即知道主内存的值已经发生了改变,因为A线程中的空循环它的优先级是非常高的...运行完这段代码之后,并不会获得期望的结果,而且会发现每次运行程序,输出的结果都不一样,都是一个小于100000的数字,这是为什么?...因为volatile它并不能够解决并发中的原子性问题,看到这是不是又懵逼了?代码中的counter++就一行代码,为什么不是原子操作呢??...3 volatile有序性 关于有序性,在程序中我们都知道,我们写的代码都是从上往下进行执行的,那么在底层它是如何知道程序是从上往下的的呢?有没有可能代码会乱序执行的呢?...看了上面四种分析,也不知道结果对错与否,接下来贴出一张我测试的动态图,来验证指令重排的效果 ? 从动态图中,是不是已经可以验证指令重排的存在了呢?那出现这种情况,有没有办法能够禁止指令重排呢?

34230

Linux——环境变量

/mybin才可以运行这个代码,而直接输入mybin是无法运行的。 为什么我们的程序就必须带路径呢?有没有什么办法来改变这一情况? 当然可以!只要把我们的程序放入环境变量PATH中就可以了....通过代码获取环境变量 在一些书籍中,C语言的main话函数是有参数的 int main(int argc,char* argv[],char* env[]){} 它们分别都是什么呢?...,argv数组的第一个指针指向的内容为可执行程序的文件名,第二个开始的指针指针指向的内容依次为加入后的选项,就是我们在命令行中输入的东西,因为我知道我们在命令行中输入的东西在运行可执行程序的时候,通过是路径...+可执行程序,因此,一般情况下,argv中的第一个元素指向的字符串是路径+可执行程序名,后面的内容就依次为命令行中输入的内容。...bash是系统创建的一个进程,其可以派生出很多的子进程,系统中几乎所有进程的父进程都是bash,我们要知道的是环境变量是可以被bash派生出来的子进程给继承下去的,而普通变量就没有办法被继承。

8210
  • CC++ volatile

    由于访问寄存器的速度要快过RAM(从RAM中读取变量的值到寄存器),以后只要变量的值没有改变,就一直从寄存器中读取变量的值,而不对RAM进行访问。...(2)在语句b=i;之前,已经通过内联汇编代码修改了i的值,但是i的变化却没有反映到b中,如果i是一个被多个任务共享的变量,这种优化带来的错误很可能是致命的。...i为第一个变量,栈空间已被ebp入栈占用了4个字节,所以i的地址为ebp-i,[ebp-i]则表示变量i的存储单元。 那如何抑制编译器对读取变量的这种优化,来防止错误读取呢?...bStop = true; } 要想通过第二个线程终止第一个线程循环,如果bStop不使用volatile定义,那么这个循环将是一个死循环,因为bStop已经读取到了寄存器中,寄存器中bStop的值永远不会变成...是否了解volatile的应用场景是区分C/C++程序员和嵌入式开发程序员的有效办法,搞嵌入式的家伙们经常同硬件、中断、RTOS等等打交道,这些都要求用到volatile变量,不懂得volatile将会带来程序设计的灾难

    1.9K31

    【Python】循环遍历傻傻分不清

    例如↓ print("*") print("*") 此时的运行结果是这样的↓ * * 而不是这样:** 从这里就明确的说明了print() 会给我们自动换行。那假设我不想让它换行呢。...有没有什么办法,那么肯定是有办法的。 如果不想给 print() 换行,我们只需要在print加上 end="" 即可。...print('*',end="") print('*') 那有小伙伴就可能会说为什么第二个不用,因为第一个已经不换行了,你第二个当然会在第一个的后面啦。...所谓死循环,指的是无法结束循环的循环结构,例如将上面 while 循环中的count+ = 1代码注释掉,再运行程序你会发现,循环会一直的继续下去。因为你的循环判断条件永远都没有改变。...18 2.50 那么在这里杰斯下为什么for用于元组不适合↓ 使用的格式字符串拼接 printf 这个变量是不方便的。

    12210

    C语言数组与指针详解

    在这之前先来复习下变量和常量,有的同学会问,这是为什么,我只能告诉你,你晕C指针,是因为你从刚开始有问题就没有重视,或者你忽略了问题的严重性,导致现在的情况,这也没有办法,中国的教育就不重视这一块,说实话...现在访问a里面的值有了两种方式(其实本来也有这两种),一个是通过变量名a(绑定的),一个是通过地址ox2c406b24,地址ox2c406b24给了p了,p指针变量(指针变量是变量,这个思维很重要)里面存放的是...那a+1呢,a是三个代表,那它是第一代表还是第二个代表,还是第三个代表呢?...这儿的a应该是第一个元素地址的意思表示的意思应该是&a[0],a+1是个地址的算术运算,而数组是个一维数组,数组中每个元素都是一个字符,a+1就是a当前地址0x28c3的下一个元素的地址0x28c4(结合图来看...看一个程序图: 程序图这个名词是我自创的,因为好多东西说不清,道不明,一个图全搞定。 上面的执行结果是什么?已经很清楚了。休息会。        上面的例子结果是:B和E

    12010

    Linux进程控制

    进程拥有独立性,fork之后就变成了两个程序,父子进程共享后边的代码。 那么为什么给父进程返回的就是子进程的pid,而给子进程返回的就是0呢?...进程终止 退出码 在写C/C++的时候,我们在main函数是程序的开始,但是最后一个位置会写return 0; 这也就代表一个程序的退出,至于为什么要写return 0,而不是返回其他的,亦或者是不写都可以...int execl(const char *path, const char *arg, …); 第一个参数是说如何找到程序,第二个参数是我们在命令行解释器怎么调用该程序就怎么写,最后用NULL结尾。...那么这个当前路径可以改变嘛?通过一个函数是可以的: 谁调用这个函数就更改谁的工作目录,参数是更改到哪个目录。...那么刚才我们的shell不能cd …是因为他只能让当前工作目录发生变化,因为shell是通过创建子进程去执行命令,我们让目录进行变化的时候是让子进程去帮助执行,也就是说改变的其实是子进程的目录,和父进程没有任何关系

    2.9K00

    当 Python 中混进一只薛定谔的猫……

    图片来源:pexels Python 是一门强大的动态语言,那动态体现在哪里,强大又体现在哪里呢? 除了好的方面,Python 的动态性是否还藏着一些使用陷阱呢,有没有办法识别与避免呢?...其中,KeyError 指的是在字典中不存在对应的 key 。为什么会这样呢,新赋值的变量是 y 或者 z,为什么对结果有这么不同的影响? 试试把 exec 去掉,不报错!...至于例 4,它跟例 3 只差了一个执行顺序,为什么不会报错呢?还有更奇怪的,在例 4 上再加一个打印(例5),理应不会影响结果,可事实却是又报错了,为什么?...接着看例 5,第一个 locals() 还是存在循环引用现象,接着 exec() 往字典中写入变量 y,但是,第二个 locals() 又触发了新的创建字典过程,会把 exec() 的执行结果覆盖,因此进入第二轮循环引用...这个结果说明,第二个 locals() 是一个字典,而且它只有唯一的 key 是 ’boc‘,而 ’boc‘ 映射的是第一个 locals() 字典,也即是 {…} 。

    52910

    【C语言】带你玩转数组(全程高能)

    是指用整型变量或表达式声明或定义的数组,而不是说数组的长度会随时变化,变长数组在其生存期内的长度同样是固定的 我们来看看这一小段代码: 为什么编译不通过?...C语言本身是不做数组下标的越界检查,编译器也不一定报错,但是编译器不报错,并不意味着程序就 是正确的, 所以程序员写代码时,最好自己做越界的检查。...第一个[]为行,第二个[]为列,比如第一个arr就是3行4列 初始化 我们可以在创建的过程中就对其赋值,完成初始化,通过调试监视窗口,让我们来看看此时数组内容是什么: 我们可以知道:1.在初始化的过程中...如果第一个比第二个大,就交换他们两个。 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。...如果数组名是首元素地址,那怎么去理解这个呢? 结果是40,为什么呢?别急,凡事都有例外:数组名是数组首元素的地址。

    53640

    【Linux修炼】11.进程的创建、终止、等待、程序替换

    进程的程序替换 创建子进程的目的: 想让子进程执行父进程代码的一部分(执行父进程对应磁盘代码中的一部分) 想让子进程执行一个全新的程序(让子进程想办法加载磁盘是指定的程序,执行新程序的代码和数据...因此对于此execl函数来讲,第一个参数path就代表找到程序对应的路径,第二个就代表选项,选哪种方式运行程序的选项;而后面的... 我们为他引入一个新的名词:可变参数列表。...但是我们发现第一个printf打印出来了,但是execl后面的printf却没有打印出来,这是为什么呢?...那在进程程序替换的时候,有没有创建新的进程呢?实际上是没有,我们一开始所创建的虚拟空间并不会变化。...上面的两个ls是不重复的,第一个ls代表着要执行谁,第二个ls代表着要怎么执行。

    6.2K00

    【C语言总集篇】分支与循环篇——从不会到会的过程

    与第二个if搭配; 语句2; 这种结构叫做if嵌套,将第二个if语句嵌套在第一个if语句内,这里我们举例来进一步理解:  这里我们可以看到,第一个else与第二个if在同一列,第二个else与第一个if...,在这里我们通过这一句改变了变量的值,从而导致变量失去了for的控制,并不能很好的进行递进;而操作符“==”的意思是判断相等,这里只起一个判断作用,并未改变变量的值,我们看一下它的打印结果: 这里我们可以看到...下面我们就来看一下在b=5之后循环内发生了什么: 此时b=5,跳出了第二个for循环; 这里我们可以看到在跳出第二个for循环后将c打印了出来,c此时为6; 这时程序进入了第一个for循环,这时a执行了...下面我们来运行一下: 这里我们可以看到,程序进入了死循环,为什么会这样呢,我们来看看这个代码的运行流程: 从执行流程中我们可以看到,通过goto语句,每次在运行到a=5时就会跳转到循环外,从a=0开始进入循环判断...,判定结果肯定为真,然后进入循环,这样就导致了程序无法走出for循环,这就是为什么运行结果是一个死循环。

    41110

    【C→C++】打开C++世界的大门

    ,当全局变量和局部变量名字相同时,局部优先嘛,这个我们之前C语言就提到过。 那现在我就想在函数f2()打印全局的a,有没有办法?...而C语言是不会进行这样的处理的,因为C语言不允许函数重载,即C程序中不会出现同名函数的,所以C语言可以直接通过函数名去匹配对应的函数,一旦出现同名函数,那这时就发生冲突了,就报错了。...通过这里就理解了C语言没办法支持重载,因为同名函数没办法区分。而C++是通过函数修饰规则来区分,只要参数不同,修饰出来的名字就不一样,就支持了重载。...为什么是这样的结果? 首先不管结果是啥,大家要能够看出来这段代码是有问题的。 什么问题呢?...欸,NULL不是指针嘛,为什么f(NULL);调用的也是第一个函数呢? 原因在于NULL在C++ 中的定义发生了一些改变。

    18910

    爆文推荐| Go slice append 之后的微妙变化

    群内小伙伴的问题更明确了,疑惑点是: fmt.Println(sl) fmt.Println(sl[:10]) 上述代码中,为什么第一个 sl 打印结果是空的,第二个 sl 给索引位置就能打印出来...也有小伙伴不断在尝试 sl[:10] 以外的输出,有没有因为一些边界值改变而导致不行。 例如: fmt.Println(sl[:]) 你认为这个对应的输出结果是什么?...是如下的答案: [10 20 30 0 0 0 0 0 0 0] 对吗? 看上去很有道理,但错了。正确的结果是: [] 是没有任何元素输出,这下大家更懵了。为什么 sl[:] 的输出结果为空?...那为什么 sl 变量的长度是 0,甚至有人猜测是不是扩容了,这其实和上面的问题还是一样,因为是值传递,自然也就不会发生变化。...要记住一个关键点:如果传过去的值是指向内存空间的地址,是可以对这块内存空间做修改的。反之,你也改不了。 至此,也就解决了我们的第一个大问题。

    1K20

    深度辨析 Python 的 eval() 与 exec()

    主要的区别是,exec() 的第一个参数不是表达式,而是代码块,这意味着两点:一是它不能做表达式求值并返回出去,二是它可以执行复杂的代码逻辑,相对而言功能更加强大,例如,当代码块中赋值了新的变量时,该变量可能...,而不像 eval() 函数,需要一个变量来接收函数的执行结果。...吊诡的局部命名空间:前面讲到了 exec() 函数内的变量是可以改变原有命名空间的,然而也有例外。...5、安全的替代用法 既然有种种安全隐患,为什么要创造出这两个内置方法呢?为什么要使用它们呢? 理由很简单,因为 Python 是一门灵活的动态语言。...与静态语言不同,动态语言支持动态地产生代码,对于已经部署好的工程,也可以只做很小的局部修改,就实现 bug 修复。 那有什么办法可以相对安全地使用它们呢?

    65520

    深度辨析 Python 的 eval() 与 exec()

    主要的区别是,exec() 的第一个参数不是表达式,而是代码块,这意味着两点:一是它不能做表达式求值并返回出去,二是它可以执行复杂的代码逻辑,相对而言功能更加强大,例如,当代码块中赋值了新的变量时,该变量可能...,而不像 eval() 函数,需要一个变量来接收函数的执行结果。...吊诡的局部命名空间:前面讲到了 exec() 函数内的变量是可以改变原有命名空间的,然而也有例外。...5、安全的替代用法 既然有种种安全隐患,为什么要创造出这两个内置方法呢?为什么要使用它们呢? 理由很简单,因为 Python 是一门灵活的动态语言。...与静态语言不同,动态语言支持动态地产生代码,对于已经部署好的工程,也可以只做很小的局部修改,就实现 bug 修复。 那有什么办法可以相对安全地使用它们呢?

    59250

    Python变量类型及变量引用

    事实上在单个程序中,变量的类型是可以改变(多次)的。         Python的对象类型,大致可以分为四类。...代码类型 —— 封装 Python 程序的元素。 内部类型 —— 程序执行期间使用的类型。...第一个看起来像传值,第二个看起来却像传引用?看到这里你是不是觉得 Python 是一种莫名其妙的语言?...验证这个的实验很简单: 不可变对象: a = 1 print id(a) a += 1 print id(a) 类似的实验想怎么做怎么做,只要那两个是不可变对象,你就一定会发现 id 变了!为什么?...其实说白了也简单,就是把参数里传入的东西对相应对象的引用依次赋给对应的内部变量(有点晕吗?)。看看第一个实验,有没有明白些什么?

    2.5K30

    【C语言】Bug、调试、strcpy

    希望对你有所帮助 Bug 程序错误,即英文的Bug,也有虫子的意思,是指在软件运行中因为程序本身有错误而造成的功能不正常、死机、数据丢失、非正常中断等现象。 为什么计算机会与bug扯上关系?...第一次被发现的导致计算机错误的飞蛾,也是第一个计算机程序错误。...>详细可见历史上的第一个计算机Bug 调试 所有发生的事情都一定有迹可循,如果问心无愧,就不需要掩盖也就没有迹象了,如果问心有愧, 就必然需要掩盖,那就一定会有迹象,迹象越多就越容易顺藤而上,这就是推理的途径...死循环,为什么呢?这时候如果不调试你压根就不知道为什么。 进入调试,查看窗口变量值的变化 当i=10的时候,已经造成了数组越界,这时候会发生什么呢?...const如果放在*的右边,修饰的是指针变量本身,保证了指针变量的内容不能修改,但是指 针指向的内容,可以通过指针改变。

    92320

    【C语言期末不挂科——指针初阶篇】

    可能你还会有疑问:“为什么内存会以字节为单位划分呢?”   其实经过前人的计算与考量,发现一个字节给一个对应的地址是比较合适的。...我们发现第一个与第二个和第四个的打印结果是相同的,也就是说他们的起始地址是相同的,第一个和第四个就不用多说,两个是同一个变量取地址打印。   ...2、已经回收资源的地址,再次访问这个地址就是非法访问。 2)如何避免野指针   由上面的学习我们知道指针玩不好代价是很大的,那么有没有什么办法防止指针越界等问题呢?...相信聪明的你能很快的得出正确的答案。我们直接来看结果:   答案是9,不知道你想对了没有,我们取了数组元素的第10个元素地址,与第一个元素地址作差,得出来的结果是9,正好就是两个数组元素的距离。   ...pa就是一级指针 int **ppa = &pa;//这里为二级指针   我们要理解一个东西,指针变量也是变量 啊,既然是变量,那么就一定有内存空间来存储指针变量,而二级指针就是取一级指针变量的地址

    9210

    从一道面试题探究 Integer 的实现

    所以根据面试官的意思肯定是使用这段代码不能交换呢,哪么不能交换的原因在哪里? ? 首先,想了下,要交换两个变量的值,利用中间变量这个思路是不会错的。既然思路没错,哪就要往具体实现上想,问题出在哪里。...第一个知识点:值传递和引用传递 我们都知道,Java 中有两种参数传递 值传递 方法调用时,实际参数把它的值传递给对应的形式参数,方法执行中形式参数值的改变不影响实际参数的值。...为什么不能改变呢? 难道 Integer 的实现有什么特殊之处? 你别说,还真是 Integer 有他自己的独特之处。...简单理解就是上面的 swap 方法其实真实交换的是 两个形参 i 和 j 的值,而没有去改变 a 和 b 的值 画个图简单理解一下: ? 哪如何去改变这个 value 值呢 ?...综上:我们就搞清楚了为什么面试官会说结果是 a = 2, b = 2 . ?

    41810

    C语言指针超详解——最终篇二

    *(a+1)很显然就是数组的第二个元素 所以这道题的输出结果为: 2,5 题目二: //在X86环境下 //假设结构体的大小是20个字节(至于为什么是 20 将在之后的博客中解释) //程序输出的结果是啥...其实这里的()是一个操作符,之前的博客介绍过,它的功能就是改变运算顺序,那这里他改变了什么顺序呢? ()里面的是什么?...实际上是逗号表达式,逗号表达式的结果是最后一个操作数,所以实际上这个二维数组 a 存放的数据为: {1 , 3 5 , 0 0 , 0} 而 p[0]指向的地方就是 a 的第一行第一个数据,也就是...题目四: //假设环境是x86环境,程序输出的结果是什么?...*--上一步得到的是 c + 1,自减得到的是 c(注意这里是把 cp 里的第三个元素修改了,使其指向 c 的第一个元素),再解引用得到就是指向 E 的指针。

    14110

    深度辨析 Python 的 eval() 与 exec()

    主要的区别是,exec() 的第一个参数不是表达式,而是代码块,这意味着两点:一是它不能做表达式求值并返回出去,二是它可以执行复杂的代码逻辑,相对而言功能更加强大,例如,当代码块中赋值了新的变量时,该变量可能...,而不像 eval() 函数,需要一个变量来接收函数的执行结果。...吊诡的局部命名空间:前面讲到了 exec() 函数内的变量是可以改变原有命名空间的,然而也有例外。...5、安全的替代用法 既然有种种安全隐患,为什么要创造出这两个内置方法呢?为什么要使用它们呢? 理由很简单,因为 Python 是一门灵活的动态语言。...与静态语言不同,动态语言支持动态地产生代码,对于已经部署好的工程,也可以只做很小的局部修改,就实现 bug 修复。 那有什么办法可以相对安全地使用它们呢?

    3K00
    领券