若变量已正确定义并赋值,符合C语言语法的表达式是() A。a=a+7; B.a=7+b+c,a++

若变量已正确定义并赋值,符合C语言语法的表达式是()A。a=a+7;B.a=7+b+c,a++C.int(12.3%4)D.a=a+7=c+b要解释,谢谢... 若变量已正确定义并赋值,符合C语言语法的表达式是()
A。a=a+7;
B.a=7+b+c,a++
C.int(12.3%4)
D.a=a+7=c+b
要解释,谢谢
展开
 我来答
御坂妹妹15842
推荐于2016-04-11 · TA获得超过326个赞
知道小有建树答主
回答量:197
采纳率:0%
帮助的人:223万
展开全部

以下详细解析.

A:正确

B:

a=7+b+c,a++;

编译器看来这句代码是可以通过编译的,但是!

逗号表达式的值是最后一个表达式的值,也就是说,a=a++;

a=a++;这句代码存在undefined behavier,C语言标准规定:逗号表达式存在序点,副作用必须在两个序点间完成.

这句代码中7+b+c的副作用可以保证被执行(事实上7+b+c没有副作用),但是不能保证a++的副作用在赋值前被执行.

也就是说,a=a++;你无法判断什么时候a会自增1,是赋值了之后a再自增呢,还是先a自增了再赋值成原来的a呢.

int a=0;
a=a++;
// a=0?a=1?

注意:尽管++的优先级比a高,但是!重点是,++的副作用完成的时间是不确定的!

C:%运算符两侧必须是整数操作数.

D:

a=a+7=c+b;

这句代码的问题在于a+7=c+b;

a+7是什么?a+7是一个右值(right-value),是不允许被赋值的.关于什么叫右值,你可以自行去百度搜搜看.


附上A和B的编译截图

追问
可是答案是B
追答

答案有问题,你可以请老师举出

a=a+7;

这句代码错误的地方.


同时也问问老师知不知道什么叫序点,什么叫副作用,什么叫ISO/IEC,什么叫ANSI C.

(注:即使是在国家标准GB中这也是Undefined behavior,国家标准事实上就是对国际ISO/IEC标准的翻译.)


栗子代码:

// for c++
#include <iostream>
int main(void)
{
    int a=0;
    a=a+7;
    std::cout << a; // must be 7
    a=a++;
    std::cout << a; // undefined behavior
    return 0;
}
// for c
#include <stdio.h>
int main(void)
{
    int a=0;
    a=a+7;
    printf("%d",a); // must be 7
    a=a++;
    printf("%d",a); // undefined behavior
    return 0;
}

同时我还可以给你个我以前做过的图片合集:这种++--的问题在不同编译器下给出的神奇答案.

http://tieba.baidu.com/p/3141315099

吖杰守望
2015-03-17
知道答主
回答量:5
采纳率:0%
帮助的人:6228
展开全部
A吧。c明显错误,B不符合逻辑,d乱七八糟
追问
正确答案是B。。。你到底会不会啊。。。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式