Printf: param transmit by lvalue and by rvalue - C (СИ)
Формулировка задачи:
Привет!
Если заменить на , то вместо h будет всегда нуль! Почему так происходит?
int output( DN2_INT const * const ss, tm const * const tm_info_ptr, bool reversed, bool quit )
{
int _ss = *ss;
int m = tm_info_ptr->tm_min;
int h = tm_info_ptr->tm_hour;
int s = tm_info_ptr->tm_sec;
if ( tm_info_ptr && ss )
{
if ( !reversed )
printf( "%d sekund je %d ur, %d minut, %d sekund\n", _ss, h, m, s );
else
printf( "%d ura, %d minut, %d sekund je %d sekund\n", h, m, s, _ss );
}
if ( quit )
{
getchar( );
exit( 0 );
}
}printf( "%d sekund je %d ur, %d minut, %d sekund\n", _ss, h, m, s );
printf( "%d sekund je %d ur, %d minut, %d sekund\n", *ss, h, m, s );
Решение задачи: «Printf: param transmit by lvalue and by rvalue»
textual
Листинг программы
~/samples$ uname -m
x86_64
~/samples$ cat foo.c
#include <stdio.h>
void foo(long* val) {
printf("%d", *val);
}
void bar(long* val) {
int x = *val;
printf("%d", x);
}
~/samples$ gcc -O2 -S foo.c
foo.c: В функции «foo»:
foo.c:5:2: предупреждение: format «%d» expects argument of type «int», but argument 2 has type «long int» [-Wformat]
~/samples$ clang -O2 -S foo.c
foo.c:5:11: warning: conversion specifies type 'int' but the argument has type 'long'
[-Wformat]
printf("%d", *val);
~^ ~~~~
%ld
1 warning generated.
~/samples$
Объяснение кода листинга программы
- В данном коде представлены две функции: foo и bar.
- Обе функции принимают аргумент типа long*.
- Внутри функции foo происходит вывод значения аргумента через функцию printf с форматом
%d. - Внутри функции bar происходит следующее:
a. Значение аргумента приводится к типу int с помощью оператора (*val) в качестве выражения rvalue.
b. Результат приведения типов сохраняется в переменной x.
c. Выводится значение переменной x через функцию printf с форматом
%d. - Предоставлен результат выполнения команды gcc -O2 -S foo.c: a. Ошибка компиляции с предупреждением формата.
- Предоставлен результат выполнения команды clang -O2 -S foo.c: a. Ошибка компиляции с предупреждением формата.
- Необходимо добавить спецификатор формата '%ld' для вывода значения типа long.