【问题标题】:Two values for one int [closed]一个int的两个值[关闭]
【发布时间】:2016-08-22 10:51:11
【问题描述】:

我想为 int x 设置两个值,为 int y 设置两个值。这段代码实际上会完美运行,但是在编译时我会收到两个警告,因为我没有为每个 int 使用其中一个值。有没有更好的方法来做到这一点,还是我应该忽略警告?

#include <stdio.h>

int main()  {
int x = (10, 20);
int y = (15, 25);

if (x > y)
{
    printf("%d\n", x);
}
else if (y > x)
{
    printf("%d\n", y);
}
else {
    printf("Both values are the same.\n");
}}

警告信息:

compare_vars.c:4:11: warning: expression result unused [-Wunused-value]
    int x = (10, 20);
             ^~
compare_vars.c:5:11: warning: expression result unused [-Wunused-value]
    int y = (15, 25);
             ^~

生成了 2 个警告。

(编辑:原来我的老师只希望每个变量都有一个值。然而,我确实从这个令人困惑的 Q/A 中学到了很多东西。下一个作业可能包含我现在觉得很舒服的数组 :-);)

【问题讨论】:

  • 你不能把两只脚放在一只鞋里!此外,您不能将两个值放在一个变量中。
  • 等等等等,它不编译但它运行?
  • 请添加您的编译错误,它有助于帮助您理解问题
  • @ChemiCalChems 这可能只是一个警告。
  • @KlasLindbäck 我开始这么认为了。

标签: c int


【解决方案1】:

int x 声明了一个x 类型的变量int int.

您正在寻找的是int,这是C 中本机不存在的数据类型。(*)

你可以使用数组...

int x[2] = { 10, 20 };

...或结构...

struct int_pair
{
    int first;
    int second;
} x;

struct int_pair x = { 10, 20 };

...但是您必须编写自己的比较函数,因为运算符&gt; 对这两种情况都不会这样做。


(*):查看例如pmg 或 Bathsheba 的回答是,为什么用看起来像一对 int 的东西初始化单个 int 不会产生编译器错误。

【讨论】:

  • 谢谢!我想我会选择数组;)
  • @CasperT.:我很乐意为您编写一个示例比较函数,但不清楚您对“大于”的定义是什么,例如(10, 20)(15, 15)。 ;-)
【解决方案2】:

逗号运算符产生右边的值。

表达式

4, 3

具有值3

您所做的是为每个变量分配一个值。


如果您的值足够小,您可以编纂这些值。例如,如果所有值都小于1000

x = 42003; // 42 and 3
y = 538907; // 538 and 907

if (x % 1000 == y / 1000) /* if 3 == 538 */;

或者你可以使用数组!

【讨论】:

  • 我看不出这种方法有什么问题。赞成。
  • x &gt; y 也足够了,就像tie 一样进行比较。不过要注意领先的 0 八进制常量...
  • "...如果所有值都小于 1000" --> 假设 int 比 16 位的 C 规范最小值宽。 “小于100”会更有意义。 16 位在 2016 年在嵌入式处理器中非常普遍。
【解决方案3】:

(10, 20); 是一个等于 20 的 表达式。(这就是 comma 运算符的工作原理:它计算所有参数并且表达式的值等于最后一项)。

所以你的代码是有效的(因此编译成功),但它确实包含冗余数据。

您想要int x[] = {10, 20}; 等代替吗?即创建一个包含两个元素的 array,并使用 x[0]x[1] &c 之类的代码访问这些元素。请注意,x &gt; y 将是 undefined 因为您将比较不属于同一个数组。

【讨论】:

  • x &gt; y 无法按预期使用数组
  • @M.M:它也不适用于struct
  • @M.M.更糟糕的是:编译器可能会吃掉你的猫。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-27
  • 1970-01-01
  • 2017-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-26
相关资源
最近更新 更多