【问题标题】:Why does this C program not compile? [closed]为什么这个 C 程序不能编译? [关闭]
【发布时间】:2014-10-09 23:44:45
【问题描述】:
#include<stdio.h>
int main()
{
int a=10,b;
a>=5?b=100:b=200;
printf("%d",b);
}

错误是什么?

它是这样工作的:

#include<stdio.h>
int main()
{
int a=10,b;
a>=5?(b=100):(b=200);
printf("%d",b);
}

为什么需要括号?

【问题讨论】:

  • 尝试将\n 添加到您的 printf 字符串中。
  • 现在它真的是stackoverflow.com/questions/13515434/…的复制品
  • @OliCharlesworth 离开main 无论如何都会刷新缓冲区。
  • 我猜人们对你的问题投了反对票,因为你没有提供错误信息。

标签: c


【解决方案1】:

分配的优先级最低,你想做的事:

a >=5 ? (b=100) : (b=200);

你原来的表达意思如下:

(a >= 5 ? b = 100 : b) = 200;

在 C 中,三元运算符 ?: 不返回左值,因此它不能将 200 分配给 ?: 的结果。这不是你所期望的。


这样设置运算符优先级使得表达式:

b = a >= 5 ? 100 : 200;

是

b = (a >= 5 ? 100 : 200);

不是

(b = a) >= 5 ? 100 : 200;

【讨论】:

  • @Paul:是的,确实如此。由于这个原因,代码无法编译。
  • @Paul 原代码无法编译。
  • @Paul:它也不能编译为 C++。 main 不能在 C++ 中返回 void。
  • 不..我的意思是为什么我们必须使用括号?为什么没有括号就不行?
  • @code_starter:你知道为什么1+2*3 给出的结果与(1+2)*3 不同吗?
【解决方案2】:

a&gt;=5?b=100:b=200;

可以写成:

b=(a&gt;=5)?100:200;

另外,

printf("%d",b);

应该是 printf("%d\n",b);

\n 强制stdout,输出缓冲区刷新。

或者,您也可以打印到无缓冲的stderr(在大多数实现中)。

fprintf(stderr, "hello"); //will print immediately, even if \n is not there

同样,要立即打印,您还可以:
printf("%d\n",b);
fflush(stdout);

如果你在 linux 中,要完全禁用缓冲:setbuf(stdout, NULL);

【讨论】:

  • 为什么还没有人评论void main()?
  • @ALL No..我的意思是为什么我们必须使用括号?为什么没有括号就不行?
  • @code_starter:括号是 C 语言中一种覆盖语句中运算符优先级并在视觉上突出显示相同的方法。因此,该语句现在起作用了,例如:is a&gt;=5。如果是,则将 b 初始化为 100,否则将 b 初始化为 200。
  • 你是对的@askmish ..我的声望已经下降到 1,因为投反对票,所以我什至不能投票给答案..这确实是一个令人沮丧的趋势
【解决方案3】:

当出现编译器错误时,您希望它如何打印?

检查下面的代码。

#include<stdio.h>
void main()
{
int a=10,b;
a>=5?(b=100):(b=200);
printf("%d",b);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多